我正在研究一个大型解决方案,其中包括40多个项目。解决方案的一些更改使发行版的构建不稳定-它引发了Access violation reading location
异常(但在调试下一切正常)。经过大量调查,我找到了问题所在,但并没有为我提供解决方案的线索。
我将sample project上传到了github。它包含重现该问题所需的最少数据量。它由3个项目组成:App
-可执行文件,TestLib
和TestLib.Data
-静态库。
TestLib.Data:
// stdafx.h
#pragma once
#include "targetver.h"
#include <afxwin.h>
//--------------------
// SomeData.h
#pragma once
class CSomeData
{
public:
CSomeData();
CSomeData(const CSomeData &cSomeData);
private:
GUID m_Guid;
};
//--------------------
// SomeData.cpp
#include "stdafx.h"
#include "SomeData.h"
CSomeData::CSomeData() {}
CSomeData::CSomeData(const CSomeData &cSomeData) {}
TestLib:
// stdafx.h
#pragma once
#include <WinSDKVer.h>
#include "targetver.h"
#include <afxwin.h>
//--------------------
// SomeClass.h
#pragma once
#include <map>
#include "..\TestLib.Data\SomeData.h"
class CSomeClass
{
public:
CSomeClass();
void doWork();
std::map<int, CSomeData> m_map;
};
//--------------------
// SomeClass.cpp
#include "stdafx.h"
#include "CSomeClass.h"
CSomeClass::CSomeClass() {}
void CSomeClass::doWork()
{
for (std::pair<int, CSomeData> p : m_map)
{
}
}
应用
它实际上包含MFC多文档应用程序的自动生成的代码。添加到MyApp
类实现中的唯一内容是:
#include "..\TestLib\CSomeClass.h"
//...
BOOL MyApp::InitInstance()
{
//...
CSomeClass sc;
sc.doWork();
return TRUE;
}
所有项目都使用Visual Studio 2013 - Windows XP (v120_xp)
平台工具集。
在Release|x86
下运行会导致Access violation
异常结束。
任何人都可以请我解释一下这是怎么回事吗?
编辑
编辑2
解决此问题的方法:
for
删除CSomeClass::doWork()
循环CSomeData
类中删除副本构造函数#include <afxwin.h>
中的stdafx.h
中删除TestLib.Data
/clr
支持我都不能用作解决方案。问题是-为什么这样的更改可以防止异常发生?
答案 0 :(得分:0)
这实际上不是答案,而是我最后的解决方案。
即使我希望摆脱clr
的支持(正如评论中的人所建议的那样)-我不能将其用作我原始项目的解决方案。原始项目包含很多托管类型,要替换所有这些用法将需要大量工作时间。
我开始研究另一种解决方案:从#include <afxwin.h>
中删除stdafx.h
。最终,我发现用#include <afx.h>
替换它可以解决崩溃问题。而且,它仍然使我可以使用托管类型和MFC类。
我没有这种行为的解释,但我希望此解决方案可以对某人有所帮助。