2009-10-14 64 views
1

如果我有一個list<object*>>* queue,並希望彈出第一個對象列表,並把它交給該計劃的另一部分,是正確使用(粗略的代碼):澄清名單和刪除元素

object* objPtr = queue->first(); 
queue->pop_first(); 
return objPtr; // is this a pointer to a valid memory address now? 

根據有關http://www.cplusplus.com/reference/stl/list/pop_front/的文檔,它調用了已刪除元素的析構函數,但我很困惑它是指鏈表的節點對象還是實際存儲的「用戶」對象。

編輯:我可能是front而不是first,我的不好。

回答

3

是的,它是一個有效的指針。列表不會釋放您分配的內存。列表將銷燬其內部而不是用戶對象。

0

您的代碼很好,但最好使用list< boost::shared_ptr<object> >


    shared_ptr < object> objPtr = queue->first(); 
    queue->pop_first(); 
    return objPtr; 
+0

爲什麼這是低票? – sbi 2009-10-14 13:04:11

+0

我沒有downvote,但這裏是我的觀點:你不能簡單地從原生指針切換到shared_ptr,所以這個答案不是很有用。 – foraidt 2009-10-14 13:34:48

+0

爲什麼當你不完全瞭解需求時使用shared_ptr會更好。 – VNarasimhaM 2009-10-14 13:35:51

3

是它是有效的:既然你把指針到列表中,只有指針被摧毀,而不是對象本身。

0

當您刪除元素時,STL容器不會銷燬堆中分配的用戶對象。

class A 
{ 

}; 


list<A*> PointerToObjectList; 

A* ptr = new A(); 
PointerToObjectList.push_back(ptr); 

如果您從列表中刪除ptr,列表將不會自動刪除該對象。一旦對象不再使用,您需要顯式調用delete。

2

objPtr包含指向有效內存的指針。

將元素插入到std::list中時,list將其複製一份。在你的情況下,元素是一個地址(一個指針),所以列表會複製地址並存儲它。現在

object * optr = queue->pop_front(); 

OPTR指向的對象

queue->pop_front(); 

將刪除list所述元件(地址/指針),optr已指向到對象。

完成對象後,請不要忘記刪除它,否則最終會導致內存泄漏。

實施例:

#include <iostream> 
#include <list> 

using namespace std; 

struct A 
{ 
    static int count; 

    A() : val(count++) { cout << "A(" << val << ")" << endl; } 
    ~A()    { cout << "~A(" << val << ")" << endl; } 

    int val; 
}; 

int A::count = 0; 

ostream& operator<<(ostream& os, A& a) { return os << a.val; } 

int main() 
{ 
    list<A*> alist; 

    for (unsigned int i = 3; i; --i) alist.push_back(new A()); 
    for (unsigned int i = 3; i; --i) 
    { 
     A * aptr = alist.front(); 
     alist.pop_front(); 
     cout << *aptr << endl; 
     delete aptr; 
     aptr = 0; 
    } 
} 
2

標準確實說(23.2.2.3/5),該元素的類型的析構函數被調用。但是這種類型在這裏是一個指針,並且指針的析構函數什麼都不做......