簡體   English   中英

創建指針的c ++向量

[英]Creating c++ vector of pointers

在我的C ++代碼中,我有一個類Object,它配有int類型的id字段。 現在我想創建一個Object *類型的指針向量。 首先我試過了

vector<Object*> v;

for(int id=0; id<n; id++) {
    Object ob = Object(id);
    v.push_back(&ob);
}

但這失敗了,因為這里同一個地址只重復了n次。 如果我使用new運算符,我會得到我想要的但我想避免動態內存分配。 然后我認為我需要的是以某種方式在for循環之前聲明n個不同的指針。 直截了當的方式是聲明一個數組,所以我這樣做:

vector<Object*> v;
Object ar[n];

for(int i=0; i<n; i++) {
    ar[i] = Object(i);
}

for(int i=0; i<n; i++) {
    v.push_back(ar+i);
}

如果我這樣做,是否還有可能導致內存泄漏? 在我看來,通過數組聲明也有點笨拙。 有沒有其他方法來創建指針向量但避免手動內存管理?

編輯:為什么我想要指針而不僅僅是普通對象?

好吧,我稍微修改了原來的實際情況,因為我以這種方式思考,我可以用最簡單的形式表示問題。 無論如何,我仍然認為這個問題可以在不知道為什么我需要一個指針向量的情況下得到解答。

其實我有

Class A {
protected:
    vector<Superobject*> vec;
...
};

Class B: public A {...};

Class Superobject {
protected:
    int id;
...
}

Class Object: public Superobject {...}

在派生類B我想用Object類型的Object填充成員字段vec 如果超類沒有使用指針,我會遇到對象切片問題。 所以在B類構造函數中,我想將vec初始化為Object*類型的指針向量。

EDIT2

是的,在我看來,動態分配是合理的選擇,使用數組的想法是個壞主意。 當數組超出范圍時,事情就會出錯,因為向量中的指針指向不一定包含對象的內存位置。

在BI類的構造函數中

B(int n) {
    vector<Object*> vec;
    Object ar[n];

    for(int id=0; id<n; id++) {
        ar[id] = Object(id);
    }

    for(int id=0; id<n; id++) {
        v.push_back(ar+id);
    }
 }

這在B類對象中引起了非常奇怪的行為。

在這個循環中:

for(int id=0; id<n; id++) {
    Object ob = Object(id);
    v.push_back(&ob);
}

您正在堆棧上創建n次Object實例。 在每次迭代時都會創建並刪除元素。 你可以使用它來避免這種情況:

for(int id=0; id<n; id++) {
    Object* ob = new Object(id);
    v.push_back(ob);
}

感謝每個新元素都存在於堆上而不是堆棧上。 嘗試在類構造函數中添加類似的東西:

std::cout<<"Object ctor()\n";

和析構函數中的相同:

std::cout<<"Object dtor()\n";

如果您不想使用@woolstar編寫的“新”嘗試原因創建這些對象

關於內存泄漏的問題讓我覺得你擔心這些對象的生命周期和清理。 我最初提出了shared_ptr包裝器,但是C ++ 11給了我們unique_ptr ,並且C ++ 14填充了缺少的make_unique 我們可以做的就是:

vector<unique_ptr<SuperObject>> v ;

您使用完美轉發和可變參數模板的精彩創建,

v.push_back( make_unique<Object>( ... ) ) ;

是的,你將不得不忍受一些堆分配,但是當v消失時,一切都將被清除。

有人提出了一個提升庫, ptr_container ,但這不僅需要為你的項目添加提升,還要教育所有未來讀者這個ptr_container是什么和做什么。

您的版本中沒有內存泄漏。 當程序離開你的范圍時,矢量和數組也會被銷毀。 關於第二個問題:為什么不直接將對象存儲在向量中?

vector<Object> v;

for(int i = 0; i < n; i++)
{
    Object obj = Object(i);
    v.push_back(obj);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM