2012-03-26 150 views
5

如何使用std :: shared_ptr作为double数组?另外使用shared_ptr的优点/缺点是什么?std :: shared_ptr的用法

+1

不要使用'的std :: shared_ptr'为一个动态分配的数组,它不会调用正确的'delete'。你可能想'std :: vector '。 – birryree 2012-03-26 16:52:20

+1

@birryree:从技术上讲,如果共享所有权语义对您很重要,您可以使用std :: shared_ptr >。或Boost的shared_array。看到这个问题,例如:http://stackoverflow.com/questions/6796655/why-use-one-vs-the-other-boostshared-array-vs-boostshared-ptrstdvecto – 2012-03-26 16:56:03

+2

@StuartGolodetz - 关于所有权语义的好点。 piyush314必须知道'shared_array'是一个Boost构造(不是标准的),如果他确实想要一个原始分配的数组,他可以使用'std :: default_delete '作为指针删除器的参数,如下所示: 'std :: shared_ptr name(new double [size],std :: default_delete ());'。 – birryree 2012-03-26 16:59:26

回答

9

这取决于你在做什么。如果你只是想双打的可变数组,去

std::vector<double> 

例子:

std::vector<double> v; 
v.push_back(23.0); 
std::cout << v[0]; 

如果共享所述阵列事项的所有权转让给你,例如使用

std::shared_ptr<std::vector<double>> 

实施例:

std::shared_ptr<std::vector<double>> v1(new std::vector<double>); 
v1->push_back(23.0); 
std::shared_ptr<std::vector<double>> v2 = v1; 
v2->push_back(9.0); 
std::cout << (*v1)[1]; 

可替换地,加速具有

boost::shared_array 

其用于类似的目的。在这里看到:

http://www.boost.org/libs/smart_ptr/shared_array.htm

至于一些优势/的shared_ptr去的缺点:

优点

  • 自动共享的基于引用计数的资源释放 - 有助于避免内存泄漏和其他与应用程序未被取消分配相关的问题
  • 可以更容易地编写异常安全代码

缺点

  • 内存开销来存储引用计数的小物件
  • 性能可以比原始指针糟糕的是显著(但衡量这个)
6

你也可以提供array deleter:

template class ArrayDeleter { 
public: 
    void operator() (T* d) const 
    { delete [] d; } 
}; 

int main() 
{ 
    std::shared_ptr array (new double [256], ArrayDeleter()); 
} 
+1

你也可以使用lambda,我想:'std :: shared_ptr array(new double [256],[](double * d ){delete [] d;});'。 – 2013-07-19 22:10:46

相关问题