gpt4 book ai didi

c++ - 为什么在所有情况下都允许指向 shared_ptr 构造的原始指针?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:26 26 4
gpt4 key购买 nike

我正在阅读 Top 10 dumb mistakes to avoid with C++11 smart pointer .第 5 条内容如下:

Mistake # 5 : Not assigning an object(raw pointer) to a shared_ptr assoon as it is created !

int main()
{
Aircraft* myAircraft = new Aircraft("F-16");
shared_ptr<aircraft> pAircraft(myAircraft);
...
shared_ptr<aircraft> p2(myAircraft);
// will do a double delete and possibly crash
}

建议是这样的:

Use make_shared or new and immediately construct the pointer withit.

好的,毫无疑问,问题和建议。但是我对 shared_ptr设计有疑问.这是一个很容易犯的错误,也是 shared_ptr 的整个“安全”设计。可能会因非常容易检测到的误用而被丢弃。

现在的问题是,是否可以使用 shared_ptr 的替代设计轻松解决此问题?其中来自原始指针的唯一构造函数是来自右值引用的构造函数?

template<class T>
struct shared_ptr{
shared_ptr(T*&& t){...basically current implementation...}
shared_ptr(T* t) = delete; // this is to...
shared_ptr(T* const& t) = delete; // ... illustrate the point.
shared_ptr(T*& t) = delete;
...
};

这样shared_ptr只能根据 new 的结果进行初始化或一些工厂功能。

这是库中 C++ 语言的未充分开发吗?如果这很可能是误用,那么从原始指针(左值)引用获取构造函数有什么意义?

这是历史事故吗? (例如,在引入 r 值引用之前提出了 shared_ptr 等)向后兼容性?

(当然可以说 std::shared_ptr<type>(std::move(ptr)); 这更容易捕捉,如果确实有必要,也可以解决。)

我错过了什么吗?

最佳答案

指针很容易复制。即使您限制为 r 值引用,您仍然可以轻松地制作拷贝(例如当您将指针作为函数参数传递时),这将使安全设置无效。此外,您会在模板中遇到问题,您可以轻松拥有 T* constT*&作为一种类型,你会得到类型不匹配。

因此,您提议在没有显着提高安全性的情况下制定更多限制,这可能是它最初不在标准中的原因。

make_shared就是原子化共享指针的构造。假设你有 f(shared_ptr<int>(new int(5)), throw_some_exception()) .标准不保证参数调用的顺序。允许编译器创建一个新的 int,运行 throw_some_exception然后构建 shared_ptr,这意味着您可以泄漏 int(如果 throw_some_exception 实际上抛出异常)。 make_shared只是在自身内部创建对象和共享指针,这不允许编译器更改顺序,因此它变得安全。

关于c++ - 为什么在所有情况下都允许指向 shared_ptr 构造的原始指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37292414/

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