[英]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::list
的push_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.