Код: Выделить всё
#include
#include
struct Foo
{
int refCount = 0;
Foo()
{
printf("Foo created at %p\n", this);
}
~Foo()
{
printf("Foo %p destroyed\n", this);
}
void incRef()
{
++refCount;
}
void decRef()
{
--refCount;
if (refCount == 0)
realDelete();
}
void realDelete()
{
this->~Foo();
::operator delete(this);
}
void operator delete(Foo* ptr, std::destroying_delete_t)
{
if (ptr->refCount == 0)
ptr->realDelete();
}
};
int main()
{
auto foo = new Foo();
foo->incRef();
delete foo;
foo->decRef();
}
< /code>
Должен ли это компилировать и работать в соответствии со стандартом? С Clang-11 это вызывает внутреннюю ошибку в компиляторе:-) < /p>
=== Исходный текст вопроса ниже === < /p>
Предположим, у меня есть класс foo В библиотеке я хочу, чтобы, по -видимому, удаленные объекты Foo фактически оставались живыми, пока определенные дополнительные внутренние условия были встречены, например, Может быть какое -то внутреннее количество ссылок, может быть некоторая асинхронная операция, которая еще не завершена и т. Д. Допустимо ли написать следующее: < /p>
Код: Выделить всё
struct Foo {
void real_delete_(Foo* ptr)
{
ptr->~Foo();
::operator delete(ptr);
}
void operator delete(Foo* ptr, std::destroying_delete_t)
{
if (/*some condition to see if we can delete now*/)
real_delete_(ptr);
// otherwise real_delete_() will be called when condition gets met
}
};
< /code>
Является ли код, описанный выше хорошо определенного? Каковы опасности, если кто -то из объектов переживает удаление Подробнее здесь: https://stackoverflow.com/questions/794 ... -an-object
Мобильная версия