C++ munmap_chunk(): 无效指针:

c++ munmap_chunk(): invalid pointer:

本文关键字:无效 指针 munmap chunk C++      更新时间:2023-10-16

我正在尝试读取和写入二进制文件,但是它主要有效

在主病中返回 0 时得到 munmap_chunk():指针无效:错误

在程序关闭时获得内存转储和堆栈跟踪

https://i.stack.imgur.com/UaCtk.jpg

这是内存转储和堆栈跟踪的屏幕截图,我不知道如何阅读

#include <fstream>
#include <iostream>
using namespace std; 
struct player{
string name;
};
bool WriteTest(player playerData){
// Create our objects.
fstream filestream;
//attempt to open file and then read first player
filestream.open ("file.bin", ios::binary | ios::out);
filestream.write(reinterpret_cast <char *> (&playerData), 
sizeof(playerData));
if(filestream.fail()){
//create file if there is no file
cout << "write open failed" << endl;
filestream.close();
return false;
}
filestream.close();
cout << "write sucsess" << endl;
return true;
}
player ReadTest(){
player playerData;
// Create our objects.
fstream filestream;
//attempt to open file and then read first player
filestream.open ("file.bin", ios::binary | ios::in);
filestream.read(reinterpret_cast <char *> (&playerData), 
sizeof(playerData));
if(filestream.fail()){
//create file if there is no file
cout << "read open failed" << endl;
filestream.close();
return playerData;
}
filestream.close();
cout << "read sucsess" << endl;
return playerData;
}
void displayPlayerData(player playerData){
cout << " Name :" << playerData.name << endl;
}
int main(){
player source;
source.name = "bap";
displayPlayerData(source);
WriteTest(source);
getchar();
player playerData = ReadTest();
displayPlayerData(playerData);
return 0;
}

你的player结构包含一个std::string,因此该类型不兼容C布局。

因此使用如下函数:

filestream.write(reinterpret_cast <char *> (&playerData), sizeof(playerData));

filestream.read(reinterpret_cast <char *> (&playerData), sizeof(playerData));

将无法正常工作。

std::string包含指向字符缓冲区的指针(如果字符串类以这种方式实现,则忽略短字符串缓冲区),将std::string直接写入文件将完全丢失这些字符,因为您只会写入指针值。

此外,读入playerData不会使用数据初始化std::string。 相反,您只会用从文件中读取的垃圾损坏std::string对象。 这很可能是程序失败的地方 - 您正在尝试使用损坏的std::string对象。

但是,为什么这永远行不通的明显迹象是,sizeof(player)是一个固定的编译时值,它是readwrite函数中的第三个参数。 在此处运行时,sizeof(player)为 32。 因此,您将始终读取/写入32字节的数据。 如果std::string name;成员包含 1,000 个字符怎么办? 如何通过指定只想读/写 32 个字节来读取/写入 1,000 个字符? 这永远行不通。

处理此问题的正确方法是:

1) 将std::string成员更改为char数组。 然后player类将是C布局兼容的,可以使用二进制文件读取/写入技术进行读写

2) 将字符串数据正确序列化到文件。 您可以重载operator >>operator <<来读取/写入字符串数据,或使用 Boost::Serialize 等库。