строка вызывает утечку памяти? - PullRequest
4 голосов
/ 20 января 2011

Visual C ++ обнаружил утечки памяти в моем коде, поэтому я сократил его до максимально простого теста и получил следующее:

#define _CRTDBG_MAP_ALLOC   // required
#include <stdlib.h>         // to enable MSVC++
#include <crtdbg.h>         // memory leak detection

#include <string>

using namespace std;

int main() {

    string foo;

    _CrtDumpMemoryLeaks();

    return 0;
}

Выход:

Detected memory leaks!
Dumping objects ->
{130} normal block at 0x008748A8, 8 bytes long.
 Data:  B4 F9 44 00 00 00 00 00 
Object dump complete.

Если я закомментирую "string foo;" он ничего не обнаруживает.

Должен ли я как-то освободить foo?

Ответы [ 3 ]

11 голосов
/ 20 января 2011

Вы запускаете _CrtDumpMemoryLeaks() слишком рано, и он сообщает о string теле как об утечке.Запускайте его только после того, как все локальные объекты могли быть уничтожены.

Или оберните всю значимую работу в отдельную функцию

void  doStuff()
{
    string variable;
}

или добавьте вложенную область действия:

int main()
{
    {
       string variable;
    }
    _CrtDumpMemoryLeaks();
    return 0;
}
9 голосов
/ 20 января 2011

Вы должны вызывать _CrtDumpMemoryLeaks после завершения программы / блока.Лучший способ сделать это - вызвать CRT, который сам по завершении программы, как указано в статье _CrtDumpMemoryLeaks msdn :

_CrtDumpMemoryLeaks, часто вызывается в конце выполнения программы дляубедитесь, что вся память, выделенная приложением, была освобождена.Функцию можно вызывать автоматически при завершении программы, включив битовое поле _CRTDBG_LEAK_CHECK_DF флага _crtDbgFlag с помощью функции _CrtSetDbgFlag.

Вызывая ее так, как вы это сделали, она обнаружит foo как утечкупоскольку его деструктор еще не был вызван, так как блок выполнения еще не закончился.

2 голосов
/ 20 января 2011

Вы звоните _CrtDumpMemoryLeaks();, пока строка еще существует - конечно, она обнаруживает, что строка еще существует!

Попробуйте это:

#define _CRTDBG_MAP_ALLOC   // required
#include <stdlib.h>         // to enable MSVC++
#include <crtdbg.h>         // memory leak detection

#include <string>

using namespace std;

int main() {
    {    
      string foo;
    }

    _CrtDumpMemoryLeaks();

    return 0;
}
...