当你去删除指针时,第一个例子不起作用。当我添加空终止符时,程序要么挂起,要么没有它,我得到:
Debug Assertion Failed Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
来自 Visual Studio 2008
//Won't work when deleting pointer:
char *at = new char [3];
at = "tw"; // <-- not sure what's going on here that strcpy does differently
at[2] = '\0'; // <-- causes program to hang
delete at;
//Works fine when deleting pointer:
char *at = new char [3];
strcpy(at,"t");
at[1] = 'w';
at[2] = '\0';
delete at;
那么当我使用双引号而不是 strcpy 时会发生什么?它们都会完美地计算出字符串,并且调试器不会显示任何不同的内容。
当你这样做时
char *at = ...;
at = "hello";
您基本上是在覆盖指针值(即,为您分配的内存的地址)new[]
) 与静态常量字符串的地址。这意味着当您稍后删除that记忆,你路过delete
先前未返回的指针new
.
这是一件坏事。
在 C 和 C++ 中,对指针的赋值通常不会对所指向的内存执行任何操作,它们会更改指针本身。如果您习惯了字符串更多是“一等公民”的语言,这可能会令人困惑。
另外,你应该使用delete[]
如果你用过new[]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)