share_ptr使用注意事项

智能指针可以提供对动态内存安全而又方便的管理,但这建立在正确使用的前提下。为了正确使用智能指针,我们必须坚持一些基本规范。

1 避免同一块内存绑定到多个独立创建的shared_ptr上,因此要不使用相同的内置指针初始化(或reset)多个智能指针,不要混合使用智能指针和普通指针,坚持只用智能指针。

2 不delete get() 函数返回的指针,因为这样操作后,shared_ptr并不知道它管理的内存被释放了,会造成shared_ptr重复析构。

3 不使用 get()函数初始化或(reset)另外的智能指针。

shared_ptr p = make_share (42);
int *q = p.get();
{
  shared_ptr(q); 
} // 程序块结束,q被销毁,指向的内存被释放。
int foo = *p; //  出错,p指向的内存已经被q释放,这是用get() 初始化另外的智能指针惹得祸。
// 请记住,永远不要用get初始化另外一个智能指针。

 

4 最安全的分配和使用动态内存的方法是用make_shared 函数,从内存开辟时就让shared_ptr接管内存管理,此函数开辟新对象空间并初始化,然后返回指向此对象的shared_ptr。

// 考虑下面对share_ptr操作的函数
void process(shared_ptr ptr){

//使用ptr

} // ptr离开作用域,被销毁。

int* x = new int (1024);
process(shared_ptr (x);
// 这样搞,执行完process之后,x所指向的内存就会被释放掉,这不是我们想要的。
// 所以应该在内存开辟的时候就让shared_ptr接管。
shared_ptr x =make_share (1024);
process(x);

 

5 如果使用的是get()返回的指针,切记当最后一个对应的智能指针销毁后,你的指针就变为无效了。

6 如果你使用的智能指针管理的资源不是new分配的内存,记住传递给它一个删除器。

 


 

 

 

你可能感兴趣的:(C++)