C++ 如果函数返回的指针未存储,会发生什么情况?

C++ 如果函数返回的指针未存储,会发生什么情况?,c++,C++,有一个函数返回一个指针(任何类型),如果我调用该函数时不存储指针,会发生什么? 在这种情况下,函数仍将返回指针吗?如果是,那么是否会因为我没有释放分配的内存而导致内存泄漏 以下面的代码为例: int * testfunc() { int * a=new int(); return(a); } int main() { testfunc(); return(0); } 是的,您必须手动释放分配给new、new[]、malloc()和calloc()的每个内存块。该方法仍将返回一个指针,并且它指

有一个函数返回一个指针(任何类型),如果我调用该函数时不存储指针,会发生什么? 在这种情况下,函数仍将返回指针吗?如果是,那么是否会因为我没有释放分配的内存而导致内存泄漏

以下面的代码为例:

int * testfunc()
{
int * a=new int();
return(a);
}

int main()
{
testfunc();
return(0);
}

是的,您必须手动释放分配给
new
new[]
malloc()
calloc()
的每个内存块。该方法仍将返回一个指针,并且它指向有效内存,但您无法使用或释放它。在C++中,你几乎总是按值返回,并会处理动态内存。

< P>绝对会有内存泄漏。您需要使用返回指针上的
delete
来平衡所有对
new
的调用


C++提供了一些类来帮助您管理
delete
:请参阅
std::unique\u ptr
。本质上,
std::unique_ptr
的析构函数调用
delete
,这通常非常有用。

我使用语句
(valgrind--leak check=full--show reachable=yes--track origins=yes./test)对问题中给出的代码运行了valgrind(使用“-g”选项编译后)
下面是输出

==59142== Memcheck, a memory error detector
==59142== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==59142== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==59142== Command: ./test
==59142==
==59142==
==59142== HEAP SUMMARY:
==59142==     in use at exit: 4 bytes in 1 blocks
==59142==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==59142==
==59142== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==59142==    at 0x4A075BC: operator new(unsigned long) (vg_replace_malloc.c:298)
==59142==    by 0x4006D3: testfunc() (test.cpp:7)
==59142==    by 0x4006EF: main (test.cpp:13)
==59142==
==59142== LEAK SUMMARY:
==59142==    definitely lost: 4 bytes in 1 blocks
==59142==    indirectly lost: 0 bytes in 0 blocks
==59142==      possibly lost: 0 bytes in 0 blocks
==59142==    still reachable: 0 bytes in 0 blocks
==59142==         suppressed: 0 bytes in 0 blocks
==59142==
==59142== For counts of detected and suppressed errors, rerun with: -v
==59142== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6)

这清楚地表明存在内存泄漏。

是的,确实存在内存泄漏

当函数退出时,函数作用域中的指针变量将被销毁,但指针分配的数据将保留在内存中。 函数返回数据所在的地址

如果这确实是您的函数的目的,那么您仍然可以使用返回的地址删除数据

int *pi = testfunc();
delete pi;

程序退出时不会出现内存泄漏,但正如您所要求的,函数中确实存在内存泄漏。

是的,它丢失并导致内存泄漏。在返回语句中添加括号是一种不好的做法,尤其是与
decltype(auto)
结合使用时,如果没有用处,则调用
release()
。请不要将非答案作为答案发布。这怎么不是答案?事实上,它详细描述了到底发生了什么@维沙尔玛:我添加了最后一句话,这有点帮助。