当我在调试模式下运行使用以下代码创建的.exe时,它显示一些断言失败并且程序崩溃但是当我运行从下面代码的发布模式创建的相同exe时,它工作正常。< / p>
请帮助确定我在调试模式下解决断言失败的原因,但不是在发布模式下。
#include<iostream>
using namespace std;
#include<string.h>
void main()
{
char *buf = new char[5]; //pre-allocated buffer
buf = "Hello";
delete [] buf;
getchar();
//cout<<buf;
//string *p = new (buf) string("hi"); //placement new
//string *q = new string("hi"); //ordinary heap allocation
}
答案 0 :(得分:4)
void main
错了。 main
返回int
。没有例外。delete[] "Hello"
。 "Hello"
是一个字符串文字;你不能delete
它。答案 1 :(得分:4)
char *buf = new char[5]; //pre-allocated buffer
在这里定义一个指针,并将其初始化为指向动态分配的缓冲区,其中包含5个字符的空间。
buf = "Hello";
这里初始化指针指向字符串文字的开头。
delete [] buf;
这里删除[] buf指针,但buf指针不再指向你新的[]'d,它指向字符串文字。你只能删除/删除一个指向你从new / new []得到的东西的指针。所以你得到了未定义的行为,可能会崩溃
您可能打算将字符串的内容复制到新的缓冲区[]中。记得考虑nul终结符:
int main()
{
char *buf = new char[6]; //pre-allocated buffer
strcpy(buf, "Hello");
delete [] buf;
getchar();
//cout<<buf;
//string *p = new (buf) string("hi"); //placement new
//string *q = new string("hi"); //ordinary heap allocation
}
尽管如此,在C ++中,你宁愿使用#include <string>
中的std :: string;
std::string = "Hello";
答案 2 :(得分:2)
执行此操作时:
buf = "Hello";
你基本上改变了buf
指向只读内存区域的指针值(内存地址),因为"Hello"
是一个字符串文字,因此存储在只读内存中
然后你试图释放那个记忆,因此崩溃。
此外,"Hello"
长度为6个字节,而不是5个。
答案 3 :(得分:2)
char *buf = new char[6]; //pre-allocated buffer
strncpy(buf, "hello", 6);
delete [] buf;
buf =“你好”;会改变buf的值,从指向新char的指针[6]到指向“hello”的指针,这是一块不在堆中的内存。
答案 4 :(得分:2)
因为未定义的行为意味着任何事情都可能发生。问题是buf = "Hello"
将字符串文字的地址分配给buf
,然后尝试删除该字面值。在调试模式下编译时,检查代码看到地址无法删除;在发布模式下,检查没有完成,删除只是踩踏一些不重要的东西。
答案 5 :(得分:2)
您正在尝试释放字符串文字"Hello"
。这一行:
buf = "Hello";
重定向指针 buf
以指向文字"Hello"
。你可能打算这样做:
char *buf = new char[6]; //need one extra space for terminating NUL character
strcpy(buf, "Hello");