Har*_*ama 1 c++ pointers memory-management
我正在初始化一个char
带有一些随机值的指针,当我试图删除它时,我无法做到.这是为什么?
这是我在做的事情:
int main()
{
char *s = new char[50]; /*
* I know there is no reason for
* using new if initializing, but
* in order to use delete we need
* to allocate using new.
*/
s = "Harry";
delete s;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
bil*_*llz 16
如果你真的想用指针练习,你需要修复你的代码.主要的问题是你试图将字符串文字(这里是const char [6])分配给指针s
然后尝试通过调用delete调用undefined behavior(UB
)来修改它.
char *s = new char[50];
strcpy(s, "Harry"); // don't assign string literal to it
// re-assign pointer to string literal,
// lost pre-allocated memory position and caused delete to fail
// it's UB to modify string literal
delete []s; // new[]/delete[], new/delete need to be called in pair.
Run Code Online (Sandbox Code Playgroud)
只需使用std::string
.
#include <string>
std::string s("Harry"); // no worries
Run Code Online (Sandbox Code Playgroud)
Lst*_*tor 10
问题是在这个任务之后:
s = "Harry";
Run Code Online (Sandbox Code Playgroud)
然后你s
不再指向你分配的内存了.它指向一个不同的数组,或者const char[6]
说准确.另一个数组未动态分配,并且不在堆上.您不能使用不在delete
堆上的变量.
此外,通过s
在释放动态分配的内存之前将指针更改为指向其他位置,会引入内存泄漏.
要解决你的代码,可以复制"Harry"
到s
通过使用阵列strcpy
,或使用std::string
替代.