返回本地char数组的遗留代码是不是错了?

Emi*_*l D 12 c++ arrays pointers memory-leaks

我遇到了一些包含如下函数的遗留代码:

LPCTSTR returnString()
{
    char buffer[50000];
    LPCTSTR t;

    /*Some code here that copies some string into buffer*/

    t = buffer;
    return t; 
}
Run Code Online (Sandbox Code Playgroud)

现在,我强烈怀疑这是错误的.我尝试调用该函数,它确实返回了您希望它返回的字符串.但是,我真的不知道这是怎么发生的:是不是char应该存储在堆栈中的数组,因此在函数退出后解除分配?如果我错了,它存储在堆上,这个函数是不是会造成内存泄漏?

小智 8

您的代码表现出未定义的行为 - 在这种情况下,UB似乎"工作".如果要将数组存储在堆上,则需要使用new []进行分配.然后函数的调用者将负责通过函数返回的指针删除它.

  • 更好的是,返回一个`std :: basic_string <TCHAR>`或类似的对象,它知道如何复制和释放它拥有的任何资源. (3认同)

Nik*_*sov 6

没有内存泄漏,但功能依然是不正确的- buffer确实是在栈上创建的,而事实上,调用者能够读取它只是运气(这只是后立即调用访问returnString()功能),该缓冲区可能会被改写通过任何进一步的函数调用或其他堆栈操作.

在调用链上传递数据的正确方法是为要填充的函数提供缓冲区和大小.


Blu*_*eft 5

你是对的,这不能保证工作; 而事实上,如果你真正存储50000字符串在这个缓冲区,然后在此之后调用一些功能(它调用的函数,调用一个函数.),几乎在每一个系统这个字符串将被破坏,由于功能的堆栈框架被推入堆栈.

它似乎工作的唯一原因是在函数返回后,不会清除过时的堆栈内存(在大多数系统上).

[编辑]为了澄清,它似乎工作,因为堆栈没有机会增长50,000字节.尝试将其更改为char buffer[10];并在之后调用某些函数returnString(),您应该看到它已损坏.