Неправильная утечка памяти в очистке?

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

Например,

File1.cpp

Obj* getMyObj()
{
    Obj* obj = NULL;
    if(condition)
    {
        obj = new Obj();   //Purify is reporting leak here
        //Fill obj
    }

    ...
    return obj;
}

File2.cpp

void myfunc()
{
    Obj* myobj = getMyObj();

   if(myobj == NULL)
       return;
    ...
    ...

    delete myobj;    //The object is deleted here
}

Даже если объект уничтожен должным образом в File2.cppПочему отчет о чистых утечках в File1.cpp?

РЕДАКТИРОВАТЬ

Проверка NULL была просто опечаткой, я исправил ее.

3 ответа

Решение

Даже если объект уничтожен должным образом в File2.cpp, [...]

Это предположение неверно.

Obj* myobj = getMyObj();

Если getMyObj фактически создает объект, он не будет возвращать нулевой указатель. Это означает, что условие в следующем if Значение true, а затем функция немедленно возвращается.

if(myobj)
    return;

В этой функции больше не выполняется код, поэтому он никогда не уничтожается.

Я рекомендую использовать умные указатели вместо ручного управления, так как ошибки такого рода просто исчезают. С C++11 вы можете использовать std::unique_ptrв противном случае вы можете использовать std::auto_ptr если ты осторожен

if(myobj)
   return;

После создания объекта возврат продолжается, а удаление не выполняется

Вам нужно изменить код:

-if(myobj)
+if(myobj==NULL)

В file1.cpp

Obj* getMyObj();

эта функция небезопасна, так как вызывающая функция должна знать, что она должна удалить возвращаемый объект, но из функции не ясно, что это необходимо

Лучше использовать умный указатель, такой как shared_ptr, вместо необработанного указателя, тогда будет ясно, что возвращаемый объект размещается в куче, а также как он уничтожается (если выделяется).

std::shared_ptr<Obj> getMyObj();
Другие вопросы по тегам