gpt4 book ai didi

c++ - 为什么 boost::scoped_ptr 或 std::unique_ptr 不可复制?

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:32 25 4
gpt4 key购买 nike

boost::scoped_ptr ,说“它提供了一个基本的‘资源获取即初始化’设施,没有共享所有权或所有权转移语义。”它是通过一些不可复制的机制完成的。

我的问题是为什么没有共享所有权的要求?

我的意思是:

 template <typename T>
class my_scoped_ptr
{
public:
// constructor implemented not shown here
// operator*() implemented not shown here
// operator -> implemented not shown here
~my_scoped_ptr()
{
delete my_p;
my_p = NULL;
}
private:
T * my_p;
};


void foo()
{
my_scoped_ptr<someclass> p (new someclass());
my_scoped_ptr<someclass> q (p); // both p & q point to same my_p object
// may be an exception is raised
}

现在好了,无论是否引发异常,my_p 都将被删除。因此,当代码超出 foo 的范围时...调用 my_scope_ptr p 析构函数,删除 my_p 并将 my_p 设置为 null。现在再次调用 my_scope_ptr q 析构函数删除 my_p ,此时它是 null 。 似乎在销毁时我不太关心剩余的复制指针是否指向有效对象。

那么,为什么我需要注意 my_scoped_ptr 不应该是可复制的?我不认为 ptr 可复制有任何危害,如果 ptr 负责删除指向的对象,一旦它退出范围。 ??!!

最佳答案

void foo()
{
my_scoped_ptr<someclass> p (new someclass());
my_scoped_ptr<someclass> q (p); // both p & q point to same my_p object
// may be an exception is raised
}

当函数结束(返回或抛出)并且 q 超出范围时,q 的析构函数将删除 某个类 对象。然后紧接着,p 超出范围,它的析构函数将再次删除 someclass 对象。

删除同一个指针两次是无效的! (除非 new 同时碰巧再次返回它)。

[ 如果任何 C++ 实现试图使其有效,它要么必须将所有具有相同值的原始指针链接在一起(这就是 shared_ptr 的用途),要么跟踪哪些地址已被删除,这意味着它们仍在使用某种内存并且没有真正释放。 ]

关于c++ - 为什么 boost::scoped_ptr 或 std::unique_ptr 不可复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19169225/

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