stack&realloc问题C++

Ben*_*ves 4 c c++ memory memory-management heap-corruption

int main()
{
   char myString = NULL;
   realloc(&myString, 5);
   strncpy((char *)&myString, "test", 5);
}
Run Code Online (Sandbox Code Playgroud)

似乎工作正常,但我仍然有点困惑堆栈与堆,这是允许的吗?myString是否需要手动释放,还是在超出范围时释放?


编辑:感谢您的回复,所以我认为这同样是非法的

//I want the code to change myString to "tests"
char myString[5] = "test";
realloc(&myString, strlen(myString)+2);
myString[4] = 's';
myString[5] = '\0';
Run Code Online (Sandbox Code Playgroud)

Dav*_*kes 19

不,这是完全错误的.realloc只应用于重新分配malloc分配的内存,你所做的只是偶然的,最终会崩溃

char *myString = malloc(x);
myString = realloc(myString,y);
free(myString)
Run Code Online (Sandbox Code Playgroud)

你最好使用new和delete,最好还是使用std :: string.


Bri*_*ndy 8

您发布的代码存在一些问题:

  • 是的,您需要释放您使用malloc和realloc分配的所有内容,以及其他相关的C样式内存分配函数.
  • 我认为你的意思是char*myString,而不是char.传递堆栈中某些东西的地址(你的字符)是完全错误的.
  • 在realloc中使用之前,需要将myString char指针初始化为NULL.
  • 你应该将4传递给strncpy而不是5,如果你有一个更大的字符串,你将覆盖内存.
  • 您应该释放在示例中创建的缓冲区
  • 您应该检查realloc调用的返回值.realloc的()

[关于realloc的返回值:]在成功完成大小不等于0时,realloc()返回指向(可能已移动)分配空间的指针.如果size为0,则返回空指针或可成功传递给free()的唯一指针.如果没有足够的可用内存,realloc()将返回一个空指针并将errno设置为[ENOMEM].

  • 传入NULL时,重新分配将像malloc一样工作:

如果ptr是空指针,则realloc()的行为类似于指定大小的malloc().

更多C++方法:

您将此标记为C++,并且使用C++的新运算符更安全.虽然新运算符不允许重新分配,但它可用于分配和重用现有缓冲区(placement new).

char *myString = new char[5];
strncpy(myString, "test", 4); 
//...
delete[] myString;
Run Code Online (Sandbox Code Playgroud)

甚至:

#include <string>

//...

std::string str = "test";
Run Code Online (Sandbox Code Playgroud)

前2名报价的来源