2

这是我第一次尝试将发布版本与 Visual C++ 2005 一起使用,似乎肯定存在一些差异。

我目前的错误是:

Unhandled exception at 0x6ef7d628 (msvcr80d.dll) in <program_name>: 
0xC0000005: Access violation reading location 0x6c2e6769.

我查看了调用堆栈,结果发现传递给我制作的静态库函数的字符串给出了“Bad Ptr”,我不知道为什么。在调试版本中工作得很好......

这是有问题的行:

int main()
{
    static Script luaScript("config.lua");

Script 只是我制作的一个处理 lua 脚本文件的类。它是静态的,因为我希望它是一个单例,因此任何代码都可以访问它。

脚本构造函数:

Script::Script(const string &filename)
{
    luaState = lua_open();
    scriptFilename = filename; // unhandled exception occurs here; Intellisense     
                               // identifies filename as a <Bad Ptr>
                               // works perfectly fine in debug

}

我想这可能是因为库也处于调试模式,但是当我尝试使用 Release 时,我似乎无法编译它。

fatal error C1010: unexpected end of file while looking for precompiled header. 
Did you forget to add '#include "stdafx.h"' to your source?

我对那个文件有点熟悉,但是为什么我的静态库的发布版本需要它呢?没有在调试中要求它。

好的,去获取 stdafx.h 文件,然后......一个新的错误出现了!:

fatal error C1083: Cannot open precompiled header file: 
'Release\Script.pch': No such file or directory

好吧,除了“Visual C++ 2005 到底想让我为发布版本做什么!?”之外,很难找到所有这些问题的核心问题。

我希望有人可以提供帮助。谢谢你。

4

2 回答 2

1

#1 修复方法Cannot open precompiled header file"是全部清理/重建。
在那之后,我将从发布版本和调试版本之间的差异开始。打开项目文件或从 Visual Studio 中比较项目设置。
在担心 Bad Ptr 问题之前,让库在发布中构建。一旦你克服了这个问题,Bad Ptr 问题很可能会消失。
否则,我看到的唯一另一件事是您传入的是 char[] 而不是 std::string。我不认为这真的是一个问题,但我会尝试

string filename = "config.lua";
static Script luaScript(filename);

在尝试了我提到的所有其他内容之后。

于 2011-07-09T19:32:18.077 回答
-1

关于单例和静态初始化的排序:

静态初始化惨败

悲剧是你有50%-50%的几率会死

如何解决?

这个问题有很多解决方案,但一个非常简单且完全可移植的解决方案是将全局 Fred 对象 x 替换为全局函数 x(),该函数通过引用返回 Fred 对象。

// File x.cpp

#include "Fred.h"

Fred& x()
{
    static Fred ans;
    return ans;
}
于 2011-07-09T20:13:00.350 回答