#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;
}
当我运行上面的程序时,它会因删除而崩溃。有什么意见吗?
答案 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 behavior。 p=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
然后尝试删除它时,它会失败。