返回指针的函数是否要求我删除返回的值?
Do functions that return pointers require that I delete the value that is returned?
假设我有一个执行某些任务的函数。该函数返回指向 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;
}
要记录对象所有权的转移并防止内存泄漏,应使用unique_ptr
返回堆上分配的对象。这是C++最佳实践。
有关更多详细信息,请参阅C++核心准则:切勿通过原始指针 (T*) 或引用 (T&) 转让所有权:
原因
如果怀疑调用方或被调用方是否拥有对象,则会发生泄漏或过早破坏。
我的问题是:我必须释放内存还是这种通用格式可以?
是的,如果动态分配内存,则必须释放内存。否则,您将冒着程序的内存使用不受控制地增长并消耗所有可用内存的风险 - 或者至少消耗超过必要的内存。
返回指针的函数是否要求我删除返回的值?
仅仅因为函数返回指针,并不一定意味着必须删除它。举个例子:
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();
在这里,您将丢失新表达式返回的值。因此,无法再delete
该值 - 后面的delete
将删除新值。这种指针值丢失以及由此导致的无法释放内存称为内存泄漏。
相关文章:
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗
- C++链表删除和删除返回功能
- 从函数返回数组时是否需要删除
- 如何删除新分配的字符,这也是函数返回值?
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- C++函数何时删除返回值?
- 为什么std ::删除文件始终返回-1
- 使用模板返回值从函数中删除类型
- 更改C 的返回指针后可以删除工作
- 删除为应该在哈希表中的记录返回 false 的函数
- unique_ptr具有右值删除器的构造函数返回 null
- 删除从函数返回的指针
- 如何在函数中返回指针之前删除指针?
- 使用自定义删除器返回unique_ptr的工厂函数
- 返回指针的函数是否要求我删除返回的值?
- 从捕获 constexpr 函数返回值的变量中删除 constexpr 会删除编译时计算
- 为什么我的COM智能指针从方法返回时会被删除
- 内置运算符(新的,删除和函数调用除外)如何返回