2012-03-26 190 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

相關問題