2016-12-14 63 views
3

如果没有第二个参数提供,我有一个默认实例化指针的函数。是在C++默认指针参数上调用的删除

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

我需要调用的函数里面明确的删除,如果我想释放OBJ或者是做自动如果我实例化从默认值PARAM指针?

我想避免做一个明确的删除自己,因为如果通过第二个参数,那么我不想删除调用者传递的指针。

+3

'delete'从未被称为语言。考虑一个基于智能指针的参数引用计数(否则你永远不会确定该对象是否构造为默认参数) – Donnie

+2

*“我想避免做一个明确的删除我自己,因为如果通过第二个参数,那么我不'你想删除调用者传递的指针。“*对。这就是为什么你不能使用这种模式。 –

+0

这看起来像是一个简单地拥有一个'doSomething(int a)'重载的机会,它使用它管理的obj指针调用'doSomething(int a,Obj * obj)'。或者更好,一个聪明的指针。还要考虑:如果某人在目前明确地将一个空指针传递给你的函数,会发生什么?看起来你可能会试图保证'obj'永远不会为空,但这是一个不好的方法... – jaggedSpire

回答

6

这听起来像你的内存所有权语义需要返工。在某些情况下,你拥有自己的记忆和其他你没有的记忆。如果你坚持默认创建一个Obj的实例,那么也接受一个布尔值来指示你是否拥有内存。但最后,我实际上建议你使用重载来完成这个任务,其中一个函数需要一个参数,而另外两个参数需要。只接受一个将创建一个Obj的实例,然后调用您的基地doSomething函数。

喜欢的东西:

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

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