Неправильная утечка памяти в очистке?
Я запустил очистку моего кода, который работает в 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();