我必须为类编写一个共享指针,并且它必须做的许多其他事情是确保它可以删除它指向的对象。
我如何编写一个可以与具有受保护析构函数的对象一起使用的解决方案?
此外,如果对象是使用placement new 创建的,我不应该调用delete
该对象,因为该空间可能仍在使用中(delete
调用是否有效?)。我怎样才能发现这种情况?
规范的相关位:
void reset();
智能指针被设置为指向空指针。当前指向的对象的引用计数(如果有)将递减。Sptr(); 构造一个指向空指针的智能指针。
template <typename U> Sptr(U *);
构造一个指向给定对象的智能指针。引用计数被初始化为 1。
Sptr(const Sptr &);
template <typename U> Sptr(const Sptr<U> &);
引用计数增加。如果 U * 不能隐式转换为 T *,这将导致语法错误。请注意,必须提供正常的复制构造函数和成员模板复制构造函数才能正确操作。
代码调用方式:
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
一切都受到保护。