调用delete时应用程序崩溃

时间:2013-09-26 14:57:41

标签: c++ visual-c++

#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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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

您要删除它,这是undefined behaviorp=new char[10]的先前结果是不可访问的内存区域。你有内存泄漏。

我建议使用std::string声明

std::string p = "sudheer";

答案 2 :(得分:2)

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

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

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

请注意,您对q做了同样的事情。如果您要复制字符串,请使用strcpy。或者,显然,您可以使用std::string(使用#include <string>),然后使用与您期望它们一样的字符串,而不是在c中使用指针。

答案 3 :(得分:0)

p="sudheer";

然后

delete p; 

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