c++11添加了新的智能指针,unique_ptr、shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated)。
但是在实际的使用过程中,很多人都会有这样的问题:
-
不知道三种智能指针的具体使用场景
-
无脑只使用shared_ptr
-
认为应该禁用raw pointer(裸指针,即Widget*这种形式),全部使用智能指针
初始化方法
class A
{
public:
A(int size){ this->size = size; }
A(){}
void Show()
{
std::cout << "A::" << size << __FUNCTION__ << std::endl;
}
private:
int size = 5;
};
...
//[1]
auto p1 = std::make_shared<int>();
auto p2 = std::make_shared<A>();
//[2]
std::shared_ptr<int> p3(new int(5));
std::shared_ptr<A> p4(new A());
//[3]
std::shared_ptr<int> p5;
p5.reset(new int(5));
std::shared_ptr<A> p6;
p6.reset(new A());
推荐使用第一种方法~
使用场景
-
unique_ptr
-
忘记delete
class Box{ public: Box() : w(new Widget()) {} ~Box() { // 忘记delete w } private: Widget* w; };
-
异常安全
void process() { Widget* w = new Widget(); w->do_something(); // 可能会发生异常 delete w; }
-
-
shared_ptr
- shared_ptr通常使用在共享权不明的场景。有可能多个对象同时管理同一个内存时。
- 对象的延迟销毁。陈硕在《Linux多线程服务器端编程》中提到,当一个对象的析构非常耗时,甚至影响到了关键线程的速度。可以使用
BlockingQueue<std::shared_ptr<void>