int main()
{
char *name = new char[7];
name = "Dolphin";
cout << "Your name is : " << name <<endl;
delete [] name;
}
Run Code Online (Sandbox Code Playgroud)
为什么VC++编译器不抱怨?
djn*_*jna 14
你有两个问题:
首先,代码有什么问题?好 ...
当您将"Dolphin"分配给名称时,您没有复制到已分配的数组中,而是将指针调整为指向字符串文字.稍后您尝试删除指针指向的内容.我希望这会在某些环境中崩溃.
如果你真的想要一个"Dolphin"字符的副本,看看strncpy(),但是已经观察过,你也需要一个null的空间.
其次,为什么特定的编译器不会警告您分配可能:这有点难.[据观察,其他编译器会发出警告.]问题是这个编译器是否将字符串文字视为"指向const char的指针"或"指向char的指针".
如果是前一种情况,那么我会发现错误.直到2004年左右,C++在将文字视为char的指针时与C一致,因此允许赋值.所以我想你的问题是确定你正在使用的规范的版本,这可能取决于你正在使用的VC++版本以及你选择的任何编译器选项.
MSDN C++ 参考指示VC++将字符串文字视为非const.我将把它留给VC++大师进一步评论.
R S*_*hko 10
这条线很糟糕:
name = "Dolphin";
Run Code Online (Sandbox Code Playgroud)
这不是复制字符串而是重新分配指针.
所以这会导致两个问题.
delete [] name;因为你试图释放指向文字字符串"Dolphin"的指针char *name = new char[7];泄露.因为这是C++,你应该使用std::string.无需手动分配或解除分配,然后获得值语义:
int main()
{
std::string name;
name = "Dolphin";
cout << "Your name is : " << name <<endl;
}
Run Code Online (Sandbox Code Playgroud)
最后,如果您想要更好地理解原始指针,那么这是一个可以正常工作的代码版本.需要注意的重要事项是代码分配长度+ 1(额外+1用于终止NUL字节)并使用strcpy将数据复制到新分配的内存中:
char *strdup_via_new(const char *str)
{
char *tmp = new char[strlen(str) + 1];
strcpy(tmp, str);
return tmp;
}
int main()
{
char *name = strdup_via_new("Dolphin");
cout << "Your name is : " << name <<endl;
delete [] name;
}
Run Code Online (Sandbox Code Playgroud)