Можно ли профилировать память только путем хранения выделенного адреса указателя в C ++? - PullRequest
3 голосов
/ 15 января 2020

Я хочу создать простой профилировщик памяти. Он будет хранить адрес, возвращаемый оператором new (или непосредственно из malloc()), связанный с выделенным размером, как событие в некоторой базе данных. Затем я хочу отслеживать освобождение, используя только адрес, переданный оператору delete (или free()).

Правда ли, что в C ++ я могу быть уверен, что указатель передан оператору delete (или free()) всегда будет тот, который был ранее выделен?

Я сомневаюсь, что внутри C ++ есть какой-то скрытый арифметический указатель c, который позволяет удалять повышенные или пониженные указатели вместо оригинальных из них.

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Правда ли, что в C ++ я могу быть уверен, что указатель, переданный оператору delete (или free ()), всегда будет указанным ранее?

Да, это правда. Это также может быть нулевой указатель, в этом случае ваша функция ничего не должна делать.

Поведение стандартной реализации этой функции в библиотеке не определено, если ptr не является нулевым указателем или указатель, ранее полученный из стандартной реализации библиотеки operator new ...

Поскольку большая часть кода написана для стандартной реализации библиотеки operator new / delete, он не проходит другие указатели на operator delete.

Кто-то может написать класс с перегруженными operator new и operator delete, которые не имеют этого требования. В этом случае он также не будет вызывать ваш пользовательский распределитель.

1 голос
/ 15 января 2020

Я сомневаюсь, что внутри C ++ есть распределитель арифметических указателей c, который позволяет удалять исходные или пониженные указатели вместо исходных.

Выделенные / освобождаемая память остается прежней, разница в том, какой деструктор называется до освобождения.

На уровне отладки у вас тот же указатель. Простой профилировщик памяти может быть реализован путем перегрузки оператора new / delete. У вас может быть карта, в которой хранятся указатели, и также проверяется, передается ли для удаления что-то, что ранее не сохранялось с вашим новым оператором.

Кроме того, существуют уровни памяти вне уровня C ++, которые вы, возможно, захотите профилировать. В Windows, VirtualAllo c, память COM, дескрипторы и т. Д. c.

...