У меня ERROR: LeakSanitizer: detected memory leaks из-за конструктора класса, использующего вектор указателей.
Здесь я просто мой код.
Problem.h
class Problem {
protected:
std::vector<const Object*> pointer_vector;
public:
// Constructor
Problem();
};
Problem.cc
Problem::Problem() {
this->pointer_vector.push_back(new Object(parameter_list_1));
this->pointer_vector.push_back(new Object(parameter_list_2));
// here I just want to push back the pointer into the vector
}
Поскольку мой код все еще работает. Но как я уже упоминал, у меня есть ERROR: LeakSanitizer: detected memory leaks.
Я думаю, что сделал что-то не так с push_back, и спрашиваю, как это сделать.
Вещь Я хочу спросить какой-нибудь общий способ решить эту проблему. Нравится
Как я могу улучшить этот код с помощью raw pointer.
Потому что я думаю, что у нас есть, безусловно, красивый способ решить эту проблему, а не возможные дубликаты нашел. Если вам нужны подробные отчеты об ошибках, я их добавлю.
Спасибо!
std::vector<Object>, наверное, вам хватит. Остальное std::vector<std::unique_ptr<const Object>>.
В порядке. Я удалил то, что здесь не актуально. Спасибо за совет.





Не зацикливайтесь на этом.
Кажется, что все, что у вас есть в вашем объекте, распределяется там, поэтому используйте умные указатели:
std::vector<std::unique_ptr<Object>> pointer_vector;
Почему вы хотите обрабатывать память самостоятельно, если в этом нет необходимости? В этом суть умных указателей, вы гарантируете отсутствие утечек памяти.
Дай угадаю ... Школьное задание с идиотскими правилами? :)
Каждый объект, который вы создаете с помощью new, в какой-то момент необходимо будет преобразовать в delete. Это ваша ответственность. В вашем случае самое простое решение - добавить его в деструктор вашего класса Problem.
Problem::~Problem() {
for (auto ptr : pointer_vector)
delete ptr;
}
Если вы когда-нибудь удаляете объекты из вектора, вы должны убедиться, что они там тоже есть deleted.
Пожалуйста, обрати внимание:, однако, правильный способ сделать это - использовать умные указатели, как уже сказал Матье в своем ответе.
Покажите минимальный воспроизводимый пример. В показанном вами коде нет двойного освобождения. Проблема где-то в коде, который вы не показали.