Как удалить память указателя на указатель в C ++ - PullRequest
0 голосов
/ 04 марта 2020

Используя Valgrind, я вижу, что у меня возникла проблема при удалении памяти в следующей функции:

Obj1 Obj1::operator*(const Obj1& param) const {
int n = param.GetSize(2);
Obj2** s = new Obj2*[n];
for( int i = 0; i < n; ++i) {
    s[i] = new Obj2(*this*param.GetColumn(i+1));
}
Obj1 res = foo(s,n);
for(int i=n-1;i>-1;i--) {
    s[i]->~Obj2();
}
delete[] s;
return res;

Valgrind сообщает мне, что утечка происходит из строки

s[i] = new Obj2(*this*param.GetColumn(i+1));

Я не совсем уверен, что проблема в том, когда я пытаюсь освободить память. Может кто-нибудь сказать мне, как решить эту проблему?

1 Ответ

1 голос
/ 04 марта 2020

Здесь:

s[i] = new Obj2(*this*param.GetColumn(i+1));

Вы создаете динамический c объект и назначаете s[i], чтобы указать на него.

Чтобы удалить его, вы делаете это:

delete s[i];

Если вы этого не сделаете, выделение будет просачиваться.

Вы должны повторить это в al oop для каждого i точно так же, как вы повторяли распределения. Конечно, вы должны сделать это, прежде чем удалить s.


s[i]->~Obj2();

Не делайте этого. Вызывать деструктор здесь неуместно. delete вызовет деструктор.


PS Не используйте необработанные указатели владения. Вместо этого используйте контейнеры или умные указатели. std::vector - это стандартные контейнеры для динамических c массивов.

PPS Вы должны избегать ненужного динамического выделения c. Ваш пример не демонстрирует необходимости динамического выделения указанных объектов. Таким образом, в этом случае вам, вероятно, следует использовать std::vector<Obj2>.

...