C++ munmap_chunk(): 无效指针:
c++ munmap_chunk(): invalid pointer:
我正在尝试读取和写入二进制文件,但是它主要有效
在主病中返回 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)
是一个固定的编译时值,它是read
和write
函数中的第三个参数。 在此处运行时,sizeof(player)
为 32。 因此,您将始终读取/写入32字节的数据。 如果std::string name;
成员包含 1,000 个字符怎么办? 如何通过指定只想读/写 32 个字节来读取/写入 1,000 个字符? 这永远行不通。
处理此问题的正确方法是:
1) 将std::string
成员更改为char
数组。 然后player
类将是C布局兼容的,可以使用二进制文件读取/写入技术进行读写
或
2) 将字符串数据正确序列化到文件。 您可以重载operator >>
和operator <<
来读取/写入字符串数据,或使用 Boost::Serialize 等库。
- 如何实现容纳整数和无效指针的双向链表?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 应用地址清理器后,免费无效指针消失
- C++ 在具有数组成员的类上无效指针/双精度释放
- 不断得到分段错误和free()无效指针
- 使用无效指针初始化指针声明符的行为是否未定义?
- 结构作为参数的函数产生错误:free():无效指针:0x00007efd47b
- 无效指针、隔离标识符等
- c++ 无效指针从空闲列表中取消排队
- C++ munmap_chunk(): 无效指针:
- 为什么我的简单C++程序使用队列和 fstream 错误到无效指针
- 无效指针和非初始化的指针之间的差异
- 如何用无效指针初始化unique_ptr的向量
- 地址清理器在静态强制转换无效指针时报告错误
- MS4:Free(Free()无效指针0xB74E74E0 ***
- ***检测到的GLIBC *** MS2:free():无效指针:0xB7526FF4 ***
- 无效指针功能的输出
- 有人能告诉我这是如何在main()中实现的吗?(关于无效指针的问题)
- C++11使用智能指针,但得到无效指针
- 无效指针的相关性