ресурсы — измерение памяти в переполнении стека

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

Мои вопросы:

  1. Можно ли этого добиться?
  2. Если да, что я должен поставить вместо ??? ?
  3. Есть ли способ сделать лучше / по-другому?
  4. Есть ли смысл делать это вообще?

0

Решение

Можно ли этого добиться? да

Если да, что я должен поместить вместо ??? ?
Используйте один из инструментов, описанных ниже.

Есть ли способ сделать лучше / по-другому?
Да смотри 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 не включен в ваш скомпилированный файл.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]