-4
#include <iostream>

using namespace std;

int main()
{
char* p=new char[10];
p="sudheer";
char* q=new char[10];
q=p;
delete []p;

return 0;
}

当我运行上述程序时,它会因删除而崩溃。任何意见?

4

4 回答 4

5

是的,您正在删除字符串文字“sudheer”,这足以使程序崩溃。

我认为您的错误是不了解如何复制 C 字符串,请使用strcpy它。此外,如果你使用new [],你必须使用delete[]delete。你可能打算写这个程序

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char* p=new char[10];
    strcpy(p,"sudheer"); // use strcpy to copy C strings
    char* q=new char[10];
    q=p;
    delete[] p;

    return 0;
}
于 2013-09-26T14:59:35.103 回答
2

文字常量"sudheer"被理解为一个指向 8 字节只读内存区域的指针。

您正在删除它,这是未定义的行为。之前的结果p=new char[10]是一个不可访问的内存区域。你有内存泄漏。

我建议使用std::stringso 声明

std::string p = "sudheer";
于 2013-09-26T14:59:36.193 回答
2

p是指向字符的指针。首先,您创建 10 个字符的内存块并告诉p指向那个 ( p=new char[10];)。您告诉的下一行p指向另一个内存块,其中包含文本“sudheer”(p="sudheer";)。

此时p不再指向您分配的内存块,因此删除p不会释放该块。它试图释放字符串。

确实 -没有任何东西指向 10 个字符的内存块了。它丢失在计算机的内存中。这是内存泄漏。

请注意,您对q. 如果要复制字符串,请使用strcpy. 或者,很明显,您可以使用std::string(with #include <string>) 然后让字符串表现得像您期望的那样,而不是在 c 中使用指针。

于 2013-09-26T15:04:30.510 回答
0
p="sudheer";

进而

delete p; 

p当您超出动态分配然后尝试删除它时,它会失败。

于 2013-09-26T15:04:44.980 回答