Утечка памяти Xcode 7.2 & Instruments не работает для кода C++

Я использую следующий код:

int main()
{
    int* foo = new int[10];
    foo = nullptr;
    sleep(60);
}

Я строю его внутри XCode 7.2 и запускаю инструменты, чтобы увидеть утечку памяти. Я изменил время задержки по-другому и изменил задержку проверки приборов (от 10 до 2 секунд). Я пытался построить проект по-другому (Release, Debug), а также пытался избежать оптимизации компилятора:

int* foo = new int[10];
for (int i = 0; i < 10; ++i)
{
    foo[i] = i*3 + i^2;
}

for (int i = 0; i < 10; ++i)
{
    cout << foo[i] << endl;;
}
foo = nullptr;
sleep(60);

но я все еще не вижу утечек внутри приборов / утечек. Что я делаю не так?

Upd: я нашел обходной путь, если я остановил консольное приложение в точке останова, а затем из консоли запустил

MacBook-Pro-andrey-2:~ owl$ leaks Ctrain
Process:         Ctrain [30305]
Path:            /Users/owl/Library/Developer/Xcode/DerivedData/Ctrain-cuhszmbcsswlznetmyijwykgudlz/Build/Products/Debug/Ctrain
Load Address:    0x100000000
Identifier:      Ctrain
Version:         ???
Code Type:       X86-64
Parent Process:  debugserver [30306]

Date/Time:       2015-12-23 21:30:28.768 +0300
Launch Time:     2015-12-23 21:30:25.837 +0300
OS Version:      Mac OS X 10.10.5 (14F27)
Report Version:  7
Analysis Tool:   /Applications/Xcode.app/Contents/Developer/usr/bin/leaks
Analysis Tool Version:  Xcode 7.2 (7C68)
----

leaks Report Version:  2.0
Process 30305: 390 nodes malloced for 34 KB
Process 30305: 1 leak for 48 total leaked bytes.
Leak: 0x1001054f0  size=48  zone: DefaultMallocZone_0x10006e000
    0x00000002 0x00000006 0x0000000a 0x0000000e     ................
    0x00000012 0x00000016 0x0000001a 0x0000001e     ................
    0x00000022 0x00000026 0x93554c2c 0x00007fff     "...&...,LU.....

но это всего лишь обходной путь, а не ответ, почему приборы не могут уловить эту утечку (или любую утечку в моем случае).

1 ответ

Да, это утечка памяти, так как вы никогда не сможете удалить память, но вы не сможете наблюдать ее, если не повторить операцию. Если у тебя есть

int main()
{
    int* foo;
    for (i = 0; i < 10; i++)
    {
        foo = new int[10];
        sleep(60);
    }
}

Вы сможете наблюдать за тем, как увеличивается потребление памяти процессом, поскольку мы никогда не освобождаем память, которую мы запрашиваем, прежде чем захватить больше памяти.

Другие вопросы по тегам