C++中默认指针参数会调用delete吗?

3

我有一个函数,默认情况下,如果第二个参数没有被提供,它会实例化一个指针。

void doSomething(int a, Obj* obj = new Obj()) {
...
}

如果我使用默认参数值实例化指针,那么在函数内部是否需要调用显式删除 delete 来释放对象?

我想避免自己显式地进行删除,因为如果传递了第二个参数,则不想删除由调用者传递的指针。


3
语言本身不会调用delete。考虑使用基于智能指针的参数,它具有引用计数功能(否则您将无法确定对象是否作为默认参数构造)。 - Donnie
2
“我想避免自己进行显式删除,因为如果传递第二个参数,则不想删除调用者传递的指针。” “是的。这就是为什么您不能使用此模式的原因。” - Cody Gray
这似乎是一个简单的机会,只需有一个doSomething(int a)重载,它调用带有由管理的obj指针的doSomething(int a, Obj* obj)。或者更好的是,使用智能指针。还要考虑:如果有人明确地将空指针传递到您的函数中,会发生什么?看起来您可能正在尝试为函数保证obj永远不为空,但这是一种不好的做法... - jaggedSpire
1个回答

6
似乎你的内存所有权语义需要重新设计。在某些情况下,你拥有内存,在其他情况下则不拥有。如果你坚持默认创建一个Obj实例,那么也接受一个布尔值来指示你是否拥有该内存。然而,最好使用重载来完成这个任务,其中一个函数接受一个参数,另外一个函数接受两个参数。只接受一个参数的函数将创建一个Obj实例,然后调用你的基础doSomething函数。

类似这样:

void doSomething(int a, Obj* obj) {
...
}

void doSomething(int a) {
   Obj tmp;
   doSomething(a, &tmp);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接