【发布时间】:2016-09-14 12:21:59
【问题描述】:
我正在阅读Top 10 dumb mistakes to avoid with C++11 smart pointer。 第 5 号内容如下:
错误 #5:没有将对象(原始指针)分配给 shared_ptr 作为 一旦创建!
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
}
建议是这样的:
使用
make_shared或new并立即构造指针 它。
好的,毫无疑问,问题和建议。
不过我对shared_ptr 的设计 有疑问。
这是一个非常容易犯的错误,shared_ptr 的整个“安全”设计可能会被非常容易检测到的误用所抛弃。
现在的问题是,是否可以通过 shared_ptr 的替代设计轻松解决此问题,其中来自原始指针的唯一构造函数是来自 r 值引用的构造函数?
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)); 更容易捕捉,如果确实有必要,也可以解决。)
我错过了什么吗?
【问题讨论】:
标签: c++ pointers c++11 shared-ptr