假设我有一个执行某些任务的函数。该函数返回一个指向int的指针。我的问题是:我是否必须取消分配内存,还是可以使用这种通用格式?
int *do_something()
{
int *local{ new int };
//do_something_here
return local;
delete local;
}
int main()
{
int *result{ new int };
result = do_something();
delete result;
return 0;
}
答案 0 :(得分:5)
要记录对象所有权的转移并防止内存泄漏,应使用unique_ptr
返回在堆上分配的对象。这是C ++的最佳做法。
有关更多详细信息,请参见C++ Core Guidelines: Never transfer ownership by a raw pointer (T*) or reference (T&):
原因
如果不确定调用者或被调用者是否拥有某个对象,将发生泄漏或过早破坏。
答案 1 :(得分:0)
我的问题是:我是否必须取消分配内存,或者这种通用格式可以吗?
是的,如果您动态分配内存,则必须释放内存。否则,您可能会冒用程序内存的风险,使其无法控制地增长并消耗所有可用内存-或至少消耗超出必要的内存。
返回指针的函数是否要求我删除返回的值?
仅仅因为一个函数返回一个指针,并不一定意味着它必须被删除。一个例子:
int* a_function(int* ptr) {
return ptr + 1;
}
int main() {
int arr[2];
int* iptr = a_function(arr);
// must not delete iptr
}
一个函数可以要求调用者删除返回的指针。您的do_something
示例函数似乎就是这样的函数。对于功能而言,这是非常糟糕的设计。如果将分配的所有权转移给调用方,则应该使用智能指针。
return local; delete local;
在返回后包含语句是没有意义的。它们将永远不会被执行。
int *result{ new int }; result = do_something();
在这里,您丢失了new-expression返回的值。结果,不再可能delete
那个值-后面的delete
会删除新值。指针值的这种丢失以及随之而来的无法解除分配内存的操作称为内存泄漏。