2013-04-11 162 views
9

我需要創建一個類實例的指針,並且程序在編譯時不知道要創建多少個指針。 對於刪除,我正在考慮將指針存儲在向量中,然後逐個刪除它們。 智能指針的使用是否更清晰? 如果一個人不想使用智能指針,這個矢量的使用會被認爲是乾淨的嗎?刪除指針向量

最小代碼:

#include <vector> 
using namespace std; 

class Foo { 
public: 
    Foo(); 
}; 
Foo::Foo(){} 
void createFooVector(int nb, std::vector<Foo*> &v){ 
    for(int i=0;i<nb;i++){ 
     Foo* f = new Foo(); 
     v.push_back(f); 
    } 
} 
int main(int argc, char *argv[]){ 
    std::vector<Foo*> v; 
    createFooVector(5,v); 
    while (!v.empty()){ 
     Foo* f = v.back(); 
     v.pop_back(); 
     delete f; 
    } 
} 
+2

你真的需要一個指針的容器嗎?你不能將你的'Foo'對象存儲爲值('std :: vector ')?另外,如果'createFooVector'返回一個新的向量而不是修改一個給定的參數,它不會更清楚嗎? – 2013-04-11 07:18:55

+0

@LucTouraille我使用指針,因爲這個原因:http://stackoverflow.com/questions/15471193/vector-of-virtual-class-are-pointers-the-clean-way-to-go ...這不可能可以在我在這裏展示的代碼中看到,儘量保持它最小 – Vince 2013-04-12 00:10:52

回答

3

我建議要麼使用boost::pointer_vector,一個std::vector<std::unique_ptr<Foo>>,或推出其持有vector<Foo*>和照顧的缺失在構造自己的Foo管理器類(你應該看到這是「專家」的解決方案,只有嘗試它如果你完全理解異常安全)。您不希望手動進行刪除,這很容易導致錯誤。

+0

雖然我不會推薦經理解決方案;很可能OP將不會像例外情況那樣安全...... – 2013-04-11 07:41:36

+0

@MatthieuM。非常真實。我加了一個警告。 – juanchopanza 2013-04-11 08:47:31

1

你的代碼是正確的。但是,使用智能指針應該是首選(更少的代碼編寫和更少的內存錯誤)。

1

會使用智能指針更乾淨的方式去?

是的。

如果一個人不想使用智能指針,那麼這種使用 向量會被認爲是乾淨的?

我沒有任何想法,爲什麼有人不希望在C++中使用智能指針,如果它不是功課... 但是,我認爲,最好在這種情況下使用類似boost::pointer_containers

1

如果您不使用從Foo派生的類,並且Foo對於複製構建體而言相對便宜,則只需使用vector<Foo>即可。

如果您的編譯器支持移動語義,則不應該存在問題。

+1

無論構建問題的代價很高,我認爲您正在考慮將*拷貝*費用昂貴。儘管有移動語義,但它可能不是什麼大問題......如果最壞的情況發生,可以使用新的'emplace_back'成員。 – 2013-04-11 07:43:21

+0

@Matthieu是的,移動語義改變了一切。爲了澄清我的意思,爲了將值推入矢量中,必須構造它,然後矢量副本構造另一個。我的意思是表明需要考慮到一般價值觀的構建。我會更新說'複製構造'。 – 2013-04-11 08:39:45