#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;
}
当我运行上述程序时,它会因删除而崩溃。任何意见?
#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;
}
当我运行上述程序时,它会因删除而崩溃。任何意见?
是的,您正在删除字符串文字“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;
}
文字常量"sudheer"
被理解为一个指向 8 字节只读内存区域的指针。
您正在删除它,这是未定义的行为。之前的结果p=new char[10]
是一个不可访问的内存区域。你有内存泄漏。
我建议使用std::string
so 声明
std::string p = "sudheer";
p
是指向字符的指针。首先,您创建 10 个字符的内存块并告诉p
指向那个 ( p=new char[10];
)。您告诉的下一行p
指向另一个内存块,其中包含文本“sudheer”(p="sudheer";
)。
此时p
不再指向您分配的内存块,因此删除p
不会释放该块。它试图释放字符串。
确实 -没有任何东西指向 10 个字符的内存块了。它丢失在计算机的内存中。这是内存泄漏。
请注意,您对q
. 如果要复制字符串,请使用strcpy
. 或者,很明显,您可以使用std::string
(with #include <string>
) 然后让字符串表现得像您期望的那样,而不是在 c 中使用指针。
p="sudheer";
进而
delete p;
p
当您超出动态分配然后尝试删除它时,它会失败。