这段代码有什么问题?

Sam*_*Sam 4 c++

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++大师进一步评论.

  • 加上原始内存泄露.再加上其他人所说的阵列是一个太小的角色.虽然关于阵列大小的部分有点不对,因为你根本就没有将Dolphin放入其中.你只是泄漏了记忆. (3认同)

R S*_*hko 10

这条线很糟糕:

name = "Dolphin";
Run Code Online (Sandbox Code Playgroud)

这不是复制字符串而是重新分配指针.

所以这会导致两个问题.

  1. 你正在释放未分配的内存,delete [] name;因为你试图释放指向文字字符串"Dolphin"的指针
  2. 分配的内存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)

  • 我想你想从`strdup_via_new`而不是`str`返回`tmp` (2认同)