Это зависит. Если вы говорите о статической библиотеке, то вы, вероятно, будете в порядке - код будет выполняться в том же контексте, что и основная программа, с использованием той же библиотеки времени выполнения C ++. Это означает, что new
и delete
будут использовать одну и ту же кучу.
Если вы говорите о разделяемой библиотеке (DLL), то, вероятно, у вас ничего не получится. Код, работающий в DLL, может использовать другую библиотеку времени выполнения C ++, что означает, что компоновка кучи будет другой. Возможно, DLL использует другую кучу.
Вызов delete
(в основной программе) по указателю, выделенному DLL (или наоборот), приведет к (в лучшем случае) немедленному падению или (в худшем случае) повреждению памяти, которое будет отслеживать вниз.
У вас есть несколько вариантов. Во-первых, используйте шаблон «фабричный метод» для создания и удаления этих объектов:
Foo *CreateFoo();
void DeleteFoo(Foo *p);
Они должны не быть реализованы в заголовочном файле.
Кроме того, вы можете определить Destroy
метод для объекта:
class Foo
{
~Foo();
public:
virtual void Destroy();
};
... опять же, не используйте это в заголовочном файле. Вы бы реализовали это так:
void Foo::Destroy()
{
delete this;
// don't do anything that accesses this object past this point.
}
Обратите внимание, что деструктор для Foo является частным, поэтому вам нужно позвонить Foo::Destroy
.
Microsoft COM делает нечто подобное, где он определяет метод Release
, который удаляет объект, когда его счетчик ссылок падает до нуля.