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