【发布时间】:2019-01-03 03:58:40
【问题描述】:
我正在研究一个包含 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) {}
测试库:
// 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
解决问题的方法:
- 从
CSomeClass::doWork()中删除for循环 - 从
CSomeData类中移除复制构造函数 - 从
stdafx.h中删除#include <afxwin.h>TestLib.Data - 移除
/clr支持
这两个我都不能用作解决方案。问题是 - 为什么这样的更改会阻止异常?
【问题讨论】:
-
您应该将用于重现问题的代码包含在问题本身中,而不是提供指向某处的链接(尽管在线编译器的附加链接会很好)。您显然在某处有 UB 或其他一些编程错误。您现在发布的代码似乎没问题,只是最好将
for (std::pair<int, CSomeData> p : m_map)重新设置为for (std::pair<int, CSomeData> & p : m_map),这样它就不会复制任何内容。 -
异常在哪里引发?失败时的调用堆栈是什么?附加调试器以找出答案。如有必要,请参阅How to: Debug Optimized Code。
-
如果这确实是异常的位置,那么这意味着
pThread为空。这意味着您的应用程序未能正确初始化。你甚至没有达到复制东西的地步;在那之前很久就失败了。 -
GitHub 上的项目在禁用 CLR 支持后运行良好。因此,要么是 CLR 意外启用的配置问题,要么是问题本身的代码和来自 github 的代码都没有重现所述问题。
-
您应该删除它们。如果您需要与 C# 互操作,则需要将使用 CLR 的代码提取到单独的二进制文件中。
标签: c++ exception visual-studio-2013 mfc release