2014-12-06 175 views
0

我想知道在下面的例子中使用指針矢量的優點是什麼。在內存管理方面,這三個向量之間是否有區別?哪一個最有效?在這種情況下,我應該使用指針向量嗎?

class foo{ 
    public: 
     foo(int a); 
    private: 
     int x; 
}; 

foo::foo(int a){ 
} 

int main() { 
    std::vector< std::shared_ptr<foo> > vec = 
     {std::make_shared<foo>(2), std::make_shared<foo>(2)}; 
    std::vector<foo*> vec2 = {new foo(2), new foo(2)}; 
    foo o1(2), o2(2); 
    std::vector<foo> vec3 = {o1, o2}; 
    return 0; 
} 
+1

爲什麼不'std :: vector vec3 = {foo {2},foo {2}};'?保持一致。 – 2014-12-06 20:35:40

回答

1

根據您當前的例子,我要說的是,std::vector<foo>是你最好的選擇。

std::vector< std::shared_ptr<foo> > vec = 
    {std::make_shared<foo>(2), std::make_shared<foo>(2)}; 

使用shared_ptr將通過存儲引用計數來處理內存管理。當沒有更多的對象引用時,對象將被銷燬。


std::vector<foo*> vec2 = {new foo(2), new foo(2)}; 
foo o1(2), o2(2); 
std::vector<foo> vec3 = {o1, o2}; 

普通整數和指針是相同的大小,以便在你的Foo類一個整型,唯一的區別是內存泄漏的可能性,如果你忘記刪除指針。

如果另一個指針正在使用foo對象並嘗試使用它,則刪除一個指針也會創建異常。


如果你需要指針,智能指針通常是最好的選擇,因爲它們的內存管理。

2

一般來說,我會考慮使用指針的矢量,如果:

  1. 在載體中的對象(或對象的部分)的壽命時間是比所述載體本身

    的壽命時間大
  2. 您依賴多態性和動態分派。然後,你必須指針的基類的載體中,與指針派生類填充它,然後通過虛擬函數做一些

共用指針具有基準計數器,所以它是稍大,但有點更安全。通常的指針,只要你一定要破壞在適當和及時

否則對象是確定的,這是很難告訴你的要求是

相關問題