2013-02-07 11 views
2

我使用vector<unique_ptr<Data>>来存储我的数据以进行自动内存管理并且成本较低,为unique_ptr。我有一个函数来尝试添加新的创建数据。数据可能真的被添加或不。它被添加了,我不需要关心它的内存删除,因为指针向量会照顾它。如果没有添加,我希望新创建的数据可以自动删除。任何简单的方法来实现它?该函数可能看起来像下面或其他类似的形式。谢谢。如何使用独特的指针向量?

// Return true if really added, return flase if not. 
bool add(vector<unique_ptr<Data>>& vec, Data* newData); 

基于戴夫的回答,是因为bool add(vector<unique_ptr<Data>>& vec, std::unique_ptr<Data>& newData)unique_ptr公众可复制好?这里在第二个参数中使用了一个引用。

+0

你想要一个行为像一个集合的向量?你有什么尝试? –

回答

8

接受newData也作为unique_ptr

bool add(vector<unique_ptr<Data>>& vec, std::unique_ptr<Data> newData) 
{ 
    if(blah blah blah) 
    { 
     vec.push_back(std::move(newData)); 
     return true; 
    } 
    return false; 
} 
+0

这是更好的'bool add(vector >&vec,std :: unique_ptr &newData)'?在第二个参数中使用引用。 – user1899020

+1

@ user1899020也许,取决于你想要的行为。如果'add'不添加它,你希望'add'的调用者仍然有一个有效的'newData'吗?如果是这样,则需要参考。如果你想让'newData'死掉,无论'add'是否添加它,像上面所做的那样按值接受它。 – David

+0

因此,使用你的函数'add(vec,std :: unique_ptr (new Data))',对吧?或者任何更简单的语法? – user1899020

1

你想达到什么样的语义。

FWIW:unique_ptr的向量很少是一个好主意。 如果你 要矢量拥有独家所有权,你最好使用Boost的指针向量 。

+1

你能告诉我一些原因或参考吗? – user1899020

+1

是的,我第二个用户1899020。我没有看到该声明中的理由。 'unique_ptr'的容器很常见... – David

+0

@ user1899020出于同样的原因,你不希望'auto_ptr'在一个容器中(和标准禁止它):这太容易意外地从容器中复制返回的值。 (或者将它从容器中移出来,这也是相同的事情。)'std :: iterator_traits <> :: value_type'是有原因的。据我所知,甚至没有保证''中的函数不会复制元素。 –