智能指针遇到的一些解答

1. auto_ptr 不建议使用的原因:

auto_ptr 采用 copy 语义来转移指针资源,转移指针资源的所有权的同时将原指针置为 nullptr,这跟通常理解的 copy 行为是不一致的(不会修改原数据),而这样的行为在有些场合下不是我们希望看到的。

例如参考《Effective STL》第 8 条,sort 的快排实现中有将元素复制到某个局部临时对象中,但对于 auto_ptr,却将原元素置为 null,这就导致最后的排序结果中可能有大量的 null。

而现在 C++11 的对 move 语义的支持,使得这样的资源转移通常只会在必要的场合发生,
例如转移一个临时变量(右值)给某个 named variable(左值),
或者一个函数的返回(右值)

这也就是用 unique_ptr 代替 auto_ptr 的原因,
本质上来说,就是 unique_ptr 禁用了 copy,而用 move 替代。

参考:auto_ptr的缺陷在哪里?为什么不应该用?

2. 常用的 shared_ptr 和 unique_ptr 的手动析构,有两种方法,

std::shared_ptr<std::string> foo(new std::string("foo"));
// foo.reset();
foo = nullptr;

根据相关解释,两种方法是等效的,虽然智能指针可以无须我们手动析构对象,但是在遇到程序崩溃的时候,并不能及时帮助我们释放对象,这时我们就需要在崩溃处理中手动释放它们。

 

posted @ 2022-01-05 19:47  strive-sun  阅读(54)  评论(0编辑  收藏  举报