我有一個類的構造函數,該類使用傳遞給它的值初始化該類內的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
{
}
能否請你解釋爲何以及如何發生內存泄漏?
對於'VectorBasedNodeOrder'對象本身的內存管理得當?如果該對象本身被泄露,valgrind不僅會爲此發出警告,還會爲其成員發出警告,包括'unique_ptr'。 – jogojapan
@jogojapan這也是我的第一個想法,但應該valgrind不會對'VectorBasedNodeOrder'實例發出警告嗎?它不,這是唯一的「絕對失敗」的警告。 – Chris
是的,沒錯,在這種情況下應該有另一個警告。 (我曾以爲你根本就沒有看這個,因爲它可能會在valgrind警告列表中進一步下降。)但是Mark B在回答中剛剛說的可能是對此的解釋。 – jogojapan