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.
您发布的代码存在一些问题:
[关于realloc的返回值:]在成功完成大小不等于0时,realloc()返回指向(可能已移动)分配空间的指针.如果size为0,则返回空指针或可成功传递给free()的唯一指针.如果没有足够的可用内存,realloc()将返回一个空指针并将errno设置为[ENOMEM].
如果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)
| 归档时间: |
|
| 查看次数: |
3992 次 |
| 最近记录: |