gpt4 book ai didi

c++ - std::string 析构函数中的访问冲突仅在调试中

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:24 25 4
gpt4 key购买 nike

几天来我一直在尝试解决这个问题,但无法让它发挥作用。我在 std::string 析构函数中的方法“orphan_all”中遇到访问冲突,该析构函数是从编译器生成的 POD 结构调用的,其中包含一些 std::string。

struct SaveData
{
SaveData()
{
MusicStage = GameState::MusicStage;
MusicSubStage= GameState::MusicSubStage;

PlotStage = GameState::PlotStage;
PlotSubStage = GameState::PlotSubStage;

GameStage = GameState::GameStage;
GameSubStage = GameState::GameSubStage;

PlayerLife = 100.0f;
PlayerSuitEnergy = 100.0f;

CurrentPower = 0;
PlayerPos = XMFLOAT3(0,0,0);
CurrentGun = 0;
Guns = 0;
ModsL1 = 0;
ModsL2 = 0;
ModsL3 = 0;
ModsL4 = 0;
CurrentBulletMod = (uint)BulletMod::NoMod;
ElectricModMult = 1.0;
ExplosiveModMult = 1.0;
CorrosiveModMult = 1.0;
}

string MusicStage;
string MusicSubStage;
string PlotStage;
string PlotSubStage;
string GameStage;
string GameSubStage;

float PlayerLife;
float PlayerSuitEnergy;
uint CurrentPower;
XMFLOAT3 PlayerPos;

uint CurrentGun;
uint CurrentBulletMod;

float ElectricModMult;
float ExplosiveModMult;
float CorrosiveModMult;

uint Guns;
uint ModsL1;
uint ModsL2;
uint ModsL3;
uint ModsL4;
};

struct FileData
{
uint64 Hash;
uint Version;
SaveData Data;
};

这就是结构。当调用该对象的析构函数时,此处:

HRESULT SavesIO::LoadGameFile(const std::string& FileName,SaveData& Data)
{
ifstream file;
file.open(FileName,ios::binary);
if(file.is_open())
{
FileData fdata;
file.read((char*)&fdata,sizeof(FileData));
if(fdata.Hash != GameHash)
{
cout << "Corrupt Savegame : " << FileName << endl;
return CheckHR(HR_Fail);
}
if(fdata.Version > CurrentVersion)
{
cout << "Savegame version is greater than game version : " << FileName << endl;
return CheckHR(HR_Fail);
}
Data = fdata.Data;
return HR_Correct;
}

cout << "Savegame : " << FileName << "not found" << endl;
return CheckHR(HR_Invalid_Arg);
}

在“orphan_all”中发生了访问冲突,这是从“fdata”中的“Data”中的字符串的析构函数调用的,它表示像“0xdddddddd”或“0xFEEEFEEE”这样的位置,所以由于某种原因它看起来调用一些已删除的数据。我使用 HeapValidate() 和 _CrtCheckMemory() 检查了堆是否损坏,一切似乎都很好。如果我在发行版中编译,问题就会消失。有人知道吗?我的系统是 Windows 8 Pro x64,使用 Visual Studio Express 2012,使用 v110 工具集编译。

编辑:我正在这样写数据:

void SavesIO::SaveGameFile(SaveData Data,const std::string& FileName)
{
ofstream file;
file.open(FileName,ios::binary);

FileData fdata;
fdata.Hash = GameHash;
fdata.Version = CurrentVersion;
fdata.Data = Data;
file.write((char*)&fdata,sizeof(FileData));

file.close();
}

最佳答案

看来 _ITERATOR_DEBUG_LEVEL 是 Debug模式崩溃的罪魁祸首。

我不反对你的解决方案。相反,这是最好的做法。但是,以下是 GoodToKnow:

要么#define _ITERATOR_DEBUG_LEVEL 0或者(甚至更好)在您的项目中定义的预编译器中设置它。

这将停止 STL 以触发异常...引用:https://msdn.microsoft.com/en-us/library/hh697468.aspx

确保所有嵌套/依赖项目都使用相同的选项编译,或者:_iterator_debug_level value '0' doesn't match value '2'

此定义的默认值为 2。

PS 看起来 MS 仍在编译他们内部开发的 STL,即使在工具集 v120 中也是如此

关于c++ - std::string 析构函数中的访问冲突仅在调试中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18561140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com