仅在发行版中例外

时间:2018-07-26 08:09:47

标签: c++ exception visual-studio-2013 mfc release

我正在研究一个大型解决方案,其中包括40多个项目。解决方案的一些更改使发行版的构建不稳定-它引发了Access violation reading location异常(但在调试下一切正常)。经过大量调查,我找到了问题所在,但并没有为我提供解决方案的线索。

我将sample project上传到了github。它包含重现该问题所需的最少数据量。它由3个项目组成:App-可执行文件,TestLibTestLib.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异常结束。

任何人都可以请我解释一下这是怎么回事吗?

编辑

异常和调用堆栈: The exception and the call stack

编辑2

解决此问题的方法:

  • for删除CSomeClass::doWork()循环
  • CSomeData类中删除副本构造函数
  • #include <afxwin.h>中的stdafx.h中删除TestLib.Data
  • 删除/clr支持

我都不能用作解决方案。问题是-为什么这样的更改可以防止异常发生?

1 个答案:

答案 0 :(得分:0)

这实际上不是答案,而是我最后的解决方案。

即使我希望摆脱clr的支持(正如评论中的人所建议的那样)-我不能将其用作我原始项目的解决方案。原始项目包含很多托管类型,要替换所有这些用法将需要大量工作时间。

我开始研究另一种解决方案:从#include <afxwin.h>中删除stdafx.h。最终,我发现用#include <afx.h>替换它可以解决崩溃问题。而且,它仍然使我可以使用托管类型和MFC类。

我没有这种行为的解释,但我希望此解决方案可以对某人有所帮助。