Почему все проигнорировали моё сообщение (
viewtopic.php?p=160997#p160997)? Отличный способ, я считаю.
DedFrendТвой метод неюзабелен как таковой, нечего обсуждать. Похожая задача решается выставлением
heaptrc.KeepReleased := true — эта опция никогда не переиспользует память и тем самым позволяет отловить запись в освобождённую память. Ни для чего, кроме (очень ресурсоёмкой) отладки неверных обращений к памяти, это использовать нельзя, но и твоё тоже нельзя, просто это менее очевидно.
>неюзабелен— Ограничение на максимальное количество указателей. От него можно избавиться через array of array или связный список array'ев, но чёрт, зачем я тебе идеи даю, ты ж реально так сделаешь вместо исправления программы, чтобы вся эта штука была не нужна в принципе.
— Потоконебезопасность. Как там, в 2000?
Конечно, пользователь может создать свой, локальный TPtrList (против глобального), тем самым обеспечив потокобезопасность, а также гарантировав, что никто извне не допишет туда свою тысячу ссылок. Но тогда возникнет вопрос, когда его освобождать: очевидно, он должен быть освобождён после всех хранимых ссылок, а это невозможно отследить.
— Переменная типа class — и так указатель на динамически выделенный объект, концептуально хранение указателя на указатель вместо просто указателя ничего не меняет, в отличие от разницы между хранением по указателю (class/^record) и по значению (record). Почему не пойти дальше и не хранить указатели на указатели на указатели? Это как раз позволит занулить их при уничтожении TPtrList, упомянутом выше. (Шутка.)