程序在解除分配字符数组时崩溃
Programme crashes while deallocating a character array
当我在调试模式下运行使用以下代码创建的.exe时,它显示一些断言失败并且程序崩溃但是当我运行从以下代码的发布模式创建的相同exe时,它工作正常。
请帮助确定为什么我在调试模式下得到断言失败,但在发布模式下却没有。
#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
}
char *buf = new char[5]; //pre-allocated buffer
在这里,您定义一个指针,并将其初始化为指向动态分配的缓冲区,该缓冲区可容纳 5 个字符。
buf = "Hello";
在这里,您将初始化指针以指向字符串文本的开头。
delete [] buf;
在这里,您删除 buf 指针,但 buf 指针不再指向您新 [] 的任何内容,它指向字符串文字。您只能删除/删除 [] 指向您从 new/new [] 获得的内容的指针。所以你会得到未定义的行为,并且可能会崩溃
您可能打算将字符串的内容复制到新 []'d 的缓冲区中。 请记住考虑 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++中,您宁愿使用 std::string from #include <string>
;
std::string = "Hello";
-
void main
错了。main
返回int
.没有例外。 - 你在做
delete[] "Hello"
."Hello"
是字符串文字;你不能delete
它。
当你这样做时:
buf = "Hello";
您基本上是在更改buf
指向只读内存区域的指针值(内存地址),因为"Hello"
是字符串文本,因此存储在只读内存中。
然后你试图释放该内存,因此崩溃。
此外,"Hello"
的长度为 6 个字节,而不是 5 个字节。
因为未定义的行为意味着任何事情都可能发生。问题是buf = "Hello"
将字符串文字的地址分配给buf
,然后尝试删除该文字。在调试模式下编译时,检查代码看到无法删除地址;在发布模式下,检查未完成,删除只是踩到不重要的东西。
您正在尝试解除分配字符串文字"Hello"
。这一行:
buf = "Hello";
将指针buf
重定向到指向文字"Hello"
。您可能打算这样做:
char *buf = new char[6]; //need one extra space for terminating NUL character
strcpy(buf, "Hello");
char *buf = new char[6]; //pre-allocated buffer
strncpy(buf, "hello", 6);
delete [] buf;
buf = "hello"; 将 buf 的值从指向新字符[6] 的指针更改为指向 "hello" 的指针,即不在堆中的内存块。
- 类对象数组的问题会导致崩溃
- 字节数组初始化会导致 DirectX 崩溃
- 使用 sf::Text 数组时崩溃
- For 循环在尝试读取数组 c++ 时程序崩溃
- 删除数组 c++ 崩溃问题
- 如果类的成员,C++数组会导致崩溃
- 在C++中删除指针数组时析构函数崩溃
- 在 C++ 中使用平展数组语法,崩溃取决于宽度/高度
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)
- 释放字符的动态数组时崩溃
- size_t结构非数组成员崩溃的强制转换
- C++程序在迭代到数组的最后一个元素时崩溃
- 从数组比较2个字符串时,程序崩溃
- C++ 尝试向类内的数组(或向量)添加值时程序崩溃
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 尝试获取数组中的最小元素时崩溃
- 动态数组在构造函数处崩溃
- 使用数组的单向链表:它在运行时崩溃
- C 程序崩溃(数组和2个指针Binsearch功能)