C++11智能指针(四):创建shared_ptr对象
2018-02-11 16:49
435 查看
1、尽量不要使用相同的原始指针来创建多个shared_ptr对象,因为在这种情况下,不同的shared_ptr对象不会知道它们与其他shared_ptr对象共享指针。
这样会造成什么样的问题?设想两个shared指针由相同的原始指针创建:
int *rawPtr = new int();
std::shared_ptr<int> ptr_1(rawPtr);
std::shared_ptr<int> ptr_2(rawPtr);
假设ptr_2超出范围,那么它将删除关联的原始指针,这样ptr1就会指向一个悬挂指针。
所以,当ptr_1超出范围,那么它将再次尝试删除相关的内存,这实际上是一个悬挂的指针。因此程序会崩溃。
实例:
#include <iostream> #include <memory> typedef struct Sample { Sample() { internalValue = 0; std::cout << "Constructor" << std::endl; } ~Sample() { std::cout << "Destructor" << std::endl; } }Sample; int main() { { Sample* rawPtr = new Sample(); std::shared_ptr<Sample> ptr_1(rawPtr); { std::shared_ptr<Sample> ptr_2(rawPtr); } //由于ptr_2不知道另一个shared_ptr(即ptr_1)使用了相同的原始指针, //因此这里当ptr_2超出了作用域,并删除了与之关联的原始指针。 //现在ptr_1在内部包含一个悬挂指针。 因此,当我们将超出范围, //它将再次尝试删除已经删除的原始指针,应用程序将崩溃。 } return 0; }
2、不要从栈而不是堆的内存中创建shared_ptr对象
检查下面的例子#include <iostream> #include <memory> int main() { int x = 12; std::shared_ptr<int> ptr(&x); return 0; }shared_ptr期望与它关联的内存来自堆,因此当它超出范围时,如果引用计数为0,则删除关联的内存。但是在上面的例子中,我们将shared_ptr对象与栈上的内存关联,在其析构函数中,这个shared_ptr对象将调用这个栈内存上的delete操作。
由于这块内存是栈而不是堆,因此程序会崩溃。
因此,建议不要直接从原始指针创建shared_ptr,而是应该使用make_shared<>
std::shared_ptr<int> ptr_1 = make_shared<int>(); std::shared_ptr<int> ptr_2(ptr_1);
相关文章推荐
- C++11智能指针shared_ptr的向上转upcast向下转downcast
- C++11智能指针(五):shared_ptr的循环引用的问题及weak_ptr
- c++11智能指针(二):shared_ptr和自定义的Deleter
- C++11智能指针Shared_ptr
- C++11智能指针Shared_ptr陷阱
- C++11智能指针(一):shared_ptr介绍与实例
- c++11智能指针(三):shared_ptr和指针
- C++11智能指针Shared_ptr陷阱
- enable_shared_from_this,关于在类的内部获取该对象shared_ptr指针的问题
- 以对象管理资源------auto_ptr shared_ptr
- 智能指针的模拟实现shared_ptr 循环引用 定置删除器
- 智能指针(模拟实现auto_ptr,shared_ptr,scooeptr 以及定制删除器c++ 实现)
- 【翻译】[Effective C++第三版•中文版][第17条]要在单独的语句中使用智能指针来存储由new创建的对象
- c++11 智能指针 unique_ptr、shared_ptr与weak_ptr
- shared_ptr基于引用计数智能指针实现
- 智能指针(二):shared_ptr实现原理
- C++11-智能指针-shared_ptr
- C++实现智能指针(shared_ptr和unique_ptr)与删除器
- C++11 shared_ptr共享智能指针
- C++11中使用shared_ptr和unique_ptr管理动态数组