我有一个函数,默认情况下,如果第二个参数没有被提供,它会实例化一个指针。
void doSomething(int a, Obj* obj = new Obj()) {
...
}
如果我使用默认参数值实例化指针,那么在函数内部是否需要调用显式删除 delete 来释放对象?
我想避免自己显式地进行删除,因为如果传递了第二个参数,则不想删除由调用者传递的指针。
我有一个函数,默认情况下,如果第二个参数没有被提供,它会实例化一个指针。
void doSomething(int a, Obj* obj = new Obj()) {
...
}
如果我使用默认参数值实例化指针,那么在函数内部是否需要调用显式删除 delete 来释放对象?
我想避免自己显式地进行删除,因为如果传递了第二个参数,则不想删除由调用者传递的指针。
Obj
实例,那么也接受一个布尔值来指示你是否拥有该内存。然而,最好使用重载来完成这个任务,其中一个函数接受一个参数,另外一个函数接受两个参数。只接受一个参数的函数将创建一个Obj
实例,然后调用你的基础doSomething
函数。
类似这样:
void doSomething(int a, Obj* obj) {
...
}
void doSomething(int a) {
Obj tmp;
doSomething(a, &tmp);
}
delete
。考虑使用基于智能指针的参数,它具有引用计数功能(否则您将无法确定对象是否作为默认参数构造)。 - DonniedoSomething(int a)
重载,它调用带有由它管理的obj指针的doSomething(int a, Obj* obj)
。或者更好的是,使用智能指针。还要考虑:如果有人明确地将空指针传递到您的函数中,会发生什么?看起来您可能正在尝试为函数保证obj
永远不为空,但这是一种不好的做法... - jaggedSpire