C++ 为什么删除此字符时会得到调试断言失败的块\u类型\u有效*

C++ 为什么删除此字符时会得到调试断言失败的块\u类型\u有效*,c++,memory,C++,Memory,在这段代码中,为什么我会得到以下debug assert failed block\u type\u是有效的 这是因为kung指针指向内存中无法取消分配的常量字符串吗?因为您不能删除字符串文本(这是kung指向的) 您也不能删除自动存储字符串(因此它实际上不是文字部分): 仅delete[]使用new[]分配的内存,因为您不能删除字符串文字(这就是kung所指的内容) 您也不能删除自动存储字符串(因此它实际上不是文字部分): 仅delete[]您使用new[]@brainydexter分配的内存

在这段代码中,为什么我会得到以下
debug assert failed block\u type\u是有效的


这是因为kung指针指向内存中无法取消分配的常量字符串吗?

因为您不能
删除
字符串文本(这是
kung
指向的)

您也不能删除自动存储字符串(因此它实际上不是文字部分):


delete[]
使用
new[]
分配的内存

,因为您不能
删除
字符串文字(这就是
kung
所指的内容)

您也不能删除自动存储字符串(因此它实际上不是文字部分):


delete[]
您使用
new[]

@brainydexter分配的内存是的,但在您的示例中,它甚至不止于此。当你写
const char*kung=“Foo”,字符串驻留在内存的只读段中。甚至修改它都是非法的,不仅仅是删除。@Luchian,我同意你的说法,但只是指出一个细节,正如所写的,brainydexter的代码使用*str++,由于优先级规则,它说,“先移动指针,然后取消引用在新地址找到的内容”。要调用坏行为,他需要执行“(*str)++”@brainydexter这就是语言的设计方式。字符串文本位于只读内存中
char*x=“foo”
在只读内存中,
char[]x=“foo”
不在只读内存中,您可以修改它。@brainydexter否。字符串池在java中。在C++中,在不同的地方可以存在多个相同的字符串,所以它不是一个池。@ BrimyDistter,Luchian是正确的。关于您的示例代码的一些注释:“inti”是“在堆栈上”,表示main的本地内存。表达式“cout@brainydexter”是的,但在您的示例中,它甚至不止于此。当你写
const char*kung=“Foo”,字符串驻留在内存的只读段中。甚至修改它都是非法的,不仅仅是删除。@Luchian,我同意你的说法,但只是指出一个细节,正如所写的,brainydexter的代码使用*str++,由于优先级规则,它说,“先移动指针,然后取消引用在新地址找到的内容”。要调用坏行为,他需要执行“(*str)++”@brainydexter这就是语言的设计方式。字符串文本位于只读内存中
char*x=“foo”
在只读内存中,
char[]x=“foo”
不在只读内存中,您可以修改它。@brainydexter否。字符串池在java中。在C++中,在不同的地方可以存在多个相同的字符串,所以它不是一个池。@ BrimyDistter,Luchian是正确的。关于您的示例代码的一些注释:“inti”是“在堆栈上”,表示main的本地内存。“cout”一词
 int main(void) {
    const char* kung = "Foo";

    delete []kung;
}
char kung[] = "Foo";
delete []kung;   //still illegal