Вам нужно задать нам реальный вопрос (a) :-) вам может быть очевидно, почему вы считаете это необходимым, но это почти наверняка нет. На самом деле, это почти всегда плохая идея. Другими словами, почему вы думаете, что вам это нужно?
Обычно я нахожу это потому, что разработчики хотят удалить или не удалять объект в зависимости от того, где он был размещен, но это обычно следует оставить на усмотрение клиента вашего кода, а не самого кода.
Обновление:
Теперь, когда вы прояснили свои причины в вопросе, прошу прощения, вы, вероятно, нашли одну из немногих областей, в которых то, что вы спрашиваете, имеет смысл (запуск ваших собственных процессов сборки мусора). В идеале вы должны переопределить все операторы выделения и отмены выделения памяти, чтобы отслеживать, что создается и удаляется из кучи.
Однако я не уверен, что это простой вопрос перехвата нового / удаления для класса, поскольку могут быть ситуации, когда delete
не вызывается, и, поскольку метка / очистка зависит от счетчика ссылок, вам нужно иметь возможность перехватывать указатель задания для его правильной работы.
Вы думали, как с этим справиться?
Классический пример:
myobject *x = new xclass();
x = 0;
не приведет к вызову удаления.
Кроме того, как вы обнаружите, что указатель на один из ваших экземпляров находится в стеке? Перехват new и delete может позволить вам сохранить, является ли сам объект стеком или кучей, но я не понимаю, как вы определяете, куда будет назначен указатель, особенно с таким кодом, как:
myobject *x1 = new xclass(); // yes, calls new.
myobject *x2 = x; // no, it doesn't.
Возможно, вам захочется изучить интеллектуальные указатели C ++, которые существенно помогут сделать ручное управление памятью устаревшим. Сами по себе общие указатели могут страдать от таких проблем, как циклические зависимости, но разумное использование слабых указателей может легко решить эту проблему.
Возможно, в вашем сценарии ручная сборка мусора больше не требуется.
(a) Это известно как X/Y problem
. Часто люди задают вопрос, предполагающий класс решения, тогда как лучший подход - просто описать проблему без никаких предубеждений относительно того, какое будет лучшее решение.
person
paxdiablo
schedule
13.01.2010
boost::invasive_ptr
, но внутри самого класса. Мне кажется, что это много неприятностей, но без всякой пользы. - person greyfade   schedule 13.01.2010