【发布时间】:2015-05-28 17:46:12
【问题描述】:
我的类有成员函数,它把它自己的类型的指针作为它的参数。
当我这样做时:
Object* obj1 = new Object();
Object* obj2 = new Object();
obj1->add_child(obj2)
delete obj1;
delete obj2;
obj1 = NULL;
obj2 = NULL;
然后运行valgrind,报告说:
HEAP SUMMARY:
in use at exit: 72,704 bytes in 1 blocks
total heap usage: 6 allocs, 5 frees, 73,098 bytes allocated
LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 72,704 bytes in 1 blocks
suppressed: 0 bytes in 0 blocks
我读到an answer 说still reachable 很好,没有泄漏。然后,当我尝试这个时:
Object* obj = new Object();
obj1->add_child(new Object());
delete obj;
obj = NULL;
valgrind 的报告说:
HEAP SUMMARY:
in use at exit: 72,877 bytes in 3 blocks
total heap usage: 6 allocs, 3 frees, 73,098 bytes allocated
LEAK SUMMARY:
definitely lost: 144 bytes in 1 blocks
indirectly lost: 29 bytes in 1 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 72,704 bytes in 1 blocks
suppressed: 0 bytes in 0 blocks
很明显,我没有删除作为参数传递的new Object() 指针。那么,如何删除那个指针呢?
详细更新
add_child(Object* obj)的定义:
void add_child(Object* obj) {
container.add_child(obj);
}
container 是Object 的成员,Object 是模板类的一个实例。
Container<Object> container;
Container 的定义是:
template<class T>
class Container {
public:
void add_child(const std::string& key, T* child) {
childrens.insert(std::pair<std::string,T*>(key, child));
}
private:
std::multimap<std::string,T*> childrens;
}
那么,childrens其实是std::multimap。
我希望这只是一个问题。
【问题讨论】:
-
指针存放在哪里?这就是你删除的内容。
-
如果不知道
Object类的定义,就无法判断。不过,您确实应该使用智能指针(例如unique_ptr或shared_ptr)。 -
请注意,它显示的是
72,704 bytes in 1 blocks,它与第二个程序中丢失指针的大小不匹配。你知道在你的程序中什么可能是一个如此大的对象吗? (因为它说“1块”,它可能是一个数组,给定这么大的尺寸) -
已更新。这就是我存储指针的方式。
-
你使用什么版本的 gcc? If it's 5.1, then you may suffer from this bug
标签: c++ pointers new-operator