2013-06-28 90 views
9

我有一個類的構造函數,該類使用傳遞給它的值初始化該類內的unique_ptr。出於某種原因,Valgrind的抱怨內存泄漏:儘管使用unique_ptr內存泄漏

22,080 (24 direct, 22,056 indirect) bytes in 1 blocks are definitely lost in loss record 6 of 6 
    at 0x4C2C7A7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
    by 0x4A64FB: VectorBasedNodeOrder::VectorBasedNodeOrder(VectorBasedNodeOrder const&) (VectorBasedNodeOrder.cpp:33) 
    /* snip more trace */ 

這是涉嫌違規代碼,剝奪了所有無關緊要的東西:

class VectorBasedNodeOrder : public NodeOrder 
{ 
public: 
    VectorBasedNodeOrder(const VectorBasedNodeOrder& order); 
protected: 
    std::unique_ptr<std::vector<Node*>> orderedNodes; 
} 

VectorBasedNodeOrder::VectorBasedNodeOrder(const VectorBasedNodeOrder& order): 
NodeOrder(order), 
orderedNodes(unique_ptr<std::vector<Node*>>(
    new std::vector<Node*>(*(order.orderedNodes)))) // <-- line 33 
{ 
} 

能否請你解釋爲何以及如何發生內存泄漏?

+1

對於'VectorBasedNodeOrder'對象本身的內存管理得當?如果該對象本身被泄露,valgrind不僅會爲此發出警告,還會爲其成員發出警告,包括'unique_ptr'。 – jogojapan

+0

@jogojapan這也是我的第一個想法,但應該valgrind不會對'VectorBasedNodeOrder'實例發出警告嗎?它不,這是唯一的「絕對失敗」的警告。 – Chris

+0

是的,沒錯,在這種情況下應該有另一個警告。 (我曾以爲你根本就沒有看這個,因爲它可能會在valgrind警告列表中進一步下降。)但是Mark B在回答中剛剛說的可能是對此的解釋。 – jogojapan

回答

25

基於您的評論的原料Node指針在其他地方管理,而不是我要採取野生刺是NodeOrder或進一步父母沒有虛析構函數的問題,當你VectorBasedNodeOrder被摧毀多態通過基類指針,子析構函數從不被調用,導致不會被破壞。

+0

'NodeOrder'確實沒有虛擬析構函數。將再次運行測試並通知您。 – Chris

+2

這是一個非常有見地的答案。我幾乎把錢放在上面。 – paddy

+0

雖然它看起來很不錯,但你會失去對野生刺刀的投注。 – SChepurin