簡體   English   中英

將push_back()“new”作為一個對象添加到c ++中的std :: list之前

[英]does push_back() “new” an object before to add to the std::list in c++

我是c ++標准庫的新手。 我想使用std :: list。 我知道如果我自己創建一個列表而不是使用stl,我應該將內存分配給一個新對象,然后將其添加到列表中。

一個C風格的A類清單:

A *ptrA = new A();     
ptrA->setElement(value);
ptrA->next = null;
currentPositionMyCstyleList->next = ptrA;
ptrA->prev = currentPositionMyCstyleList;

如果我使用stl,是否有必要“新”一個對象? 將push_back()“new”作為一個對象添加到c ++中的std :: list之前?

代碼如下正確嗎?

A aObj(value);     
listA.push_back(aObj); // Will push_back() "new" an object and copy the value of aObject to the object before add it to list

aObj的值是否會在下面的代碼中發布:

funcAddToList() {
    A aObj(value);     
    listA.push_back(aObj);
}
funcDispList() {
    // display listA  // Does the value of aObj still in list?
}

push_back()實際上做了什么?

讀完stl_list.h_push_back()_ M_insert_M_create_node后我仍然感到 困惑

謝謝你的時間。

std::listpush_back方法將復制或移動您的參數。

在內部,由實現來處理它想要管理對象的方式。

在所有的可能性...

該列表有一個分配器。 默認分配器只是調用new (正如您所期望的那樣)。 如果適合,您可以提供備用分配器。

由於您使用的是C ++ 11,因此您可能會受益於emplace_back ,這應該避免您產生的任何構造/移動/釋放開銷。

emplace_back仍會調用分配器...

或者,如果您“移動”該值,它可能會有所幫助:

list.push_back(std::move(v));

假設您已經在元素類型上定義了有用的移動語義。

std::list可以包含對象或指向對象的指針。

std::list<MyObj> list1;
list.push_back(MyObj()); // push an anonymous object (rvalue)
MyObj a;
list.push_back(a); // push (copy) a

std::list<MyObj*> list2;
list2.push_back(new MyObj());
MyObj* b = new MyObj();
list2.push_back(b);

list1是MyObj的列表,當您清除列表時,列表中的MyObj實例將被銷毀並釋放內存。 list2是一個指針列表,當您清除列表時,實例不會被銷毀。

push_back在堆上創建參數的副本。 但是list2是一個指針列表,因此只復制指針,而不是對象本身。

由於其臨時行為,匿名對象(稱為rvalue)可能會在列表中“移動”:未分配內存,但列表中的指針將指向已分配的內存。 此行為取決於push_back的類型和實現。

是的,來自std::list push_back使用new (或malloc() )在堆上創建一個新對象。 它創建了參數的副本。


你的第二個片段是正確的。 aObj被復制。

aObj的第三個片段副本中將保留在列表中,而aObj本身將被刪除。

如果容器的模板參數是POD類型,則push_back為其分配一個新的內存塊,並使用傳遞的值進行初始化。 如果模板參數是復雜數據類型a-ka類的對象,那么它也會被分配,然后使用復制構造函數調用進行實例化(復制構造函數的參數將是push_back的傳遞參數)。

暫無
暫無

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

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