Я только что вырвал свои волосы, пытаясь заставить инструменты кашлять от моих намеренно созданных утечек памяти. Мой тестовый пример выглядит так:
class Leaker
{
public:
char *_array;
Leaker()
{
_array=new char[1000];
}
~Leaker()
{
}
};
void *leaker()
{
void *p=malloc(1000);
int *pa=new int[2000];
{
Leaker l;
Leaker *pl=new Leaker();
}
return p;
}
int main (int argc, char **argv)
{
for (int i=0; i<1000; ++i) {
leaker();
}
sleep(2); // Needed to give Instruments a chance to poll memory
return 0;
}
В основном инструменты никогда не обнаруживали явных утечек. Я сходил с ума по поводу того, почему, но потом обнаружил «сек между автоопределениями» на панели «Конфигурация утечек» под панелью «Утечки». Я набрал его обратно настолько низко, насколько это возможно, что составляло 1 секунду, и поместил sleep (2) в мой код, и вуаля; утечки найдены!
Насколько я понимаю, утечка - это утечка, независимо от того, происходит ли она 30 минут в приложении или 30 миллисекунд. В моем случае я раздвинул тестовый пример до приведенного выше кода, но мое настоящее приложение - это приложение командной строки без пользовательского интерфейса или чего-либо еще, и оно работает очень быстро; безусловно, меньше, чем 10-секундный интервал выборки по умолчанию.
Хорошо, так что я могу прожить пару секунд после выхода из моего приложения в инструментальном режиме, но я действительно хочу, чтобы при выходе было просто иметь память для моментальных снимков инструментов, а затем делать все, что нужно в течение времени, пока приложение работает.
Итак ... вопрос заключается в следующем: есть ли способ сделать память инструментов моментальным снимком при выходе из приложения, независимо от интервала выборки?
Приветствия
Шейн