gpt4 book ai didi

c++ - 删除具有 protected 析构函数的对象

转载 作者:太空狗 更新时间:2023-10-29 20:28:17 25 4
gpt4 key购买 nike

我必须为类编写一个共享指针,它必须做的许多其他事情之一就是确保它可以删除它指向的对象。

我如何编写一个解决方案来处理具有 protected 析构函数的对象?

此外,如果对象是使用 placement new 创建的,我不应该调用 delete在对象上,因为该空间可能仍在使用中(delete 调用是否有效?)。如何检测此类情况?

规范的相关部分:

void reset(); The smart pointer is set to point to the null pointer. The reference count for the currently pointed to object, if any, is decremented.

Sptr(); Constructs a smart pointer that points to the null pointer.

template <typename U>
Sptr(U *);
Constructs a smart pointer that points to the given object. The reference count is initialized to one.

Sptr(const Sptr &);<br/>
template <typename U> Sptr(const Sptr<U> &);

The reference count is incremented. If U * is not implicitly convertible to T *, this will result in a syntax error. Note that both the normal copy constructur and a member template copy constructor must be provided for proper operation.

代码的调用方式:

        Sptr<Derived> sp(new Derived);
char *buf = (char *) ::operator new(sizeof(Sptr<Base1>));
Sptr<Base1> &sp2 = *(new (buf) Sptr<Base1>());
sp2 = sp;
sp2 = sp2;
sp.reset();
sp2.reset();
::operator delete(buf);

Base1一切都受到保护。

最佳答案

使析构函数成为非公开的全部意义在于防止对象被任意销毁。没有很好的方法来解决这个问题。 (即使有通用方法,也不是方法,因为它需要打破封装才能做到这一点。)

如果你想让一个对象被除它本身之外的某个类销毁,请将析构函数公开。如果不这样做,那么您的指针类也将无法销毁该对象。

或者,您可以使指针类成为您希望它使用的任何类的友元。但这在很多方面都很丑陋,尤其是它相当武断地限制了您可以使用它的有效对象类型。

关于c++ - 删除具有 protected 析构函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13571968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com