Может ли C ++ 20 уничтожить удаление использоваться для безопасного отложения разрушения объекта?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Может ли C ++ 20 уничтожить удаление использоваться для безопасного отложения разрушения объекта?

Сообщение Anonymous »

Моя первоначальная попытка обеспечить обоснование, кажется, отвлекает от реального вопроса. Пожалуйста, рассмотрите следующую минимальную программу, которая использует C ++ 20 «Уничтожающий оператор удаления», чтобы отложить удаление объекта. Обратите внимание, что объект не уничтожен, и при этом не будет устранена базовая память до удаления Foo; . Вопрос в том, разрешено ли это стандартом или нет. < /P>

Код: Выделить всё

#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>
В библиотеке я хочу, чтобы, по -видимому, удаленные объекты 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»