gpt4 book ai didi

c++ - 如何删除在函数参数上声明的新指针?

转载 作者:行者123 更新时间:2023-11-30 00:48:50 25 4
gpt4 key购买 nike

我的类有成员函数,它接受自己类型的指针作为参数。

当我这样做时:

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);
}

containerObject 的成员,Object 是模板类的一个实例。

Container<Object> 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

我希望这个问题不会太长。

最佳答案

您需要对谁拥有 指针做出明确且一致的选择。如果你决定add_child 取得所有权,那么调用者应该期望他们不需要删除传入的指针。如果您决定 add_child 不取得所有权,然后调用者保留所有权并删除指针。

你可以制作Object取得所有权,所以它的析构函数删除所有已添加到它的子指针。那么你的第一个例子应该是

Object* obj1 = new Object();
Object* obj2 = new Object();

obj1->add_child(obj2);

delete obj1; // also deletes obj2 automatically

还有你的第二个:

Object* obj = new Object();

obj->add_child(new Object());

delete obj; // automatically deletes the unnamed pointer passed in on previous line

如果你不想Object取得所有权,那么你就有问题了,因为你无法删除 new Object()在调用者的上下文中。

如果您使用智能指针,管理所有权就会变得容易得多。 add_child可以拍std::unique_ptr<Object>争论。

auto obj1 = std::make_unique<Object>();
auto obj2 = std::make_unique<Object>();
obj1->add_child(std::move(obj2)); // obj1 takes ownership
// both pointers automatically deleted at scope exit

auto obj = std::make_unique<Object>();
obj->add_child(std::make_unique<Object>());
// both pointers automatically deleted at scope exit

关于c++ - 如何删除在函数参数上声明的新指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30513642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com