Можно ли измерить количество памяти, высвобождаемой после завершения объекта деструктором. Я пытаюсь проверить, правильно ли управляются ресурсы. Например, я написал реализацию LinkedList
и тестирую это:
int main(int argc, char** argv) {
//check point for initial memory
int64_t init = ??? ;
//next points of measurement
int64_t point_a, point_b;
List<int> list;
list.push_back(5);
{
List<double> l;
l.push_back(-0.12);
l.push_back(1.6);
// ... do something else
// ................
// ................
l.push_back(-4.75);
l.push_back(7.8);
l.print();
point_a = ??? ;// memory state after operations with list
}//calling destructor
point_b = ??? ; // memory state after destruction of the l - object
std::cout << "Initial memory: " << init
<< ", memory in scope: " << point_b
<< ", after destructor: " << (point_b - point_a) << "\n";
return 0;
}//main();
Мои вопросы:
???
?Можно ли этого добиться? да
Если да, что я должен поместить вместо ??? ?
Используйте один из инструментов, описанных ниже.
Есть ли способ сделать лучше / по-другому?
Да смотри Valgrind а также MemWatch описано ниже.
Есть ли смысл делать это вообще?
Нет, если в вашем коде есть ошибки, такие как сбои в магазине, вполне вероятно, что ваши проверки также могут содержать ошибки. Лучше всего использовать стандартный инструмент, если вы можете, или для больших проектов, создать процесс аудита памяти, который прост и ищет утечки, регистрирует его и перезапускает любые процессы, которые занимают слишком много памяти.
Два отличных инструмента для обнаружения утечек памяти Valgrind а также MemWatch.
Использовать valgrind
проверить ваш код на наличие ошибок, если вы запустили программу с помощью:
myprog arg1 arg2
Затем проверьте наличие утечек памяти, используя valgrind
с опцией —leak-check, чтобы включить детальный детектор утечки памяти:
valgrind --leak-check=yes myprog arg1 arg2
Valgrind
это здорово, так как вы можете запустить его на своей скомпилированной программе как есть.
MemWatch
еще один полезный инструмент, но менее популярный. Вы можете прочитать об этом Вот. Он должен быть встроен в вашу программу во время компиляции путем включения «memwatch.h» в качестве вашего последнего включения в каждый файл.
Если -DMEMWATCH
определяется во время компиляции, MemWatch
заменяет системные вызовы, которые выделяют / освобождают память, своими собственными оболочками, чтобы он мог отслеживать утечки памяти. Когда вы запустите свой код, он создаст подробный журнал всех ваших выделений и сообщит об ошибках, если память не была освобождена должным образом. Это действительно хорошо для студентов, выполняющих классные задания, когда преподаватель просит студентов включить его в свои проекты. Студенты и ТП могут выполнять эти проверки автоматически, не изучая, как интерпретировать результаты valgrind.
Чтобы создать свой проект с MemWatch, загрузите memwatch.c
а также memwatch.h
Вот из GitHub, и скомпилируйте, используя следующие параметры:
gcc -o myProg -DMEMWATCH -DMEMWATCH_STDIO MyProg.c memwatch.c
Когда вы запускаете свою программу с MemWatch
включен, MemWatch
сообщит обо всех местах, где память управляется неправильно, и запишет ее в журнал, чтобы вы могли просматривать ее после выполнения кода. Если вы не определите MEMWATCH
а также MEMWATCH_STDIO
при компиляции, MemWatch
не включен в ваш скомпилированный файл.
Других решений пока нет …