1

在发布时,它会因未处理的异常而崩溃:std::length 错误。

调用堆栈如下所示:

msvcr90.dll!__set_flsgetvalue()  Line 256 + 0xc bytes   C
msvcr90.dll!__set_flsgetvalue()  Line 256 + 0xc bytes   C
msvcr90.dll!_getptd_noexit()  Line 616 + 0x7 bytes  C
msvcr90.dll!_getptd()  Line 641 + 0x5 bytes C
msvcr90.dll!rand()  Line 68 C
NEM.exe!CGAL::Random::Random()  + 0x34 bytes    C++
msvcr90.dll!_initterm(void (void)* * pfbegin=0x00000003, void (void)* * pfend=0x00345560)  Line 903 C
NEM.exe!__tmainCRTStartup()  Line 582 + 0x17 bytes  C
kernel32.dll!7c817067()     

有没有人有任何线索?

4

4 回答 4

3

检查堆栈转储:

InitTerm 只是一个遍历其他函数列表并逐步执行每个函数的函数——除其他外,它用于全局构造函数(在启动时)、全局析构函数(在关闭时)和 atexit 列表(也在关闭时)。

您正在与 CGAL 链接,因为CGAL::Random::Random在您的堆栈转储中是由于 CGAL 定义了一个名为default_randomCGAL::Random::Random类型的全局变量。这就是为什么你的错误发生在 main 之前,default_random正在构建。

从 CGAL 源,它所做的一切都是调用标准 C ,srand(time(NULL))然后调用本地get_int,而本地又调用标准 Crand()以获取随机数。

但是,由于您的堆栈转储仍在srand().

看起来它正在将您的线程懒惰地转换为光纤,即,这是您第一次尝试在线程中执行某些操作,并且它必须在继续之前设置光纤本地存储。

所以,有几件事要尝试和调查。

1/ 您是否在 XP 之前运行此代码?我相信光纤本地存储(__set_flsgetvalue)是在 XP 中引入的。这是一个很长的镜头,但无论如何我们都需要清理它。

2/你需要链接CGAL吗?我假设您的应用程序需要 CGAL 库中的某些内容,否则不要与它链接。它可能是另一个项目文件的遗留问题。

3/ 如果您使用CGAL,请确保您使用的是最新版本。从 3.3 开始,它支持动态链接,可以防止混合不同库版本(静态/动态和调试/非调试)的可能性。

4/你能尝试用VC8编译吗?CGAL 支持的平台还不包括 VC9 (VS2008)。您可能需要与 CGAL 团队一起跟进,看看他们是否正在提供支持。

5/ 最后,你安装了 Boost 吗?这是另一个长镜头,但无论如何都值得一看。

如果这些建议都没有帮助,恐怕您将不得不等待比我更有知识的人出现。

祝你好运。

于 2008-12-02T05:53:02.930 回答
0

main() 之前的崩溃通常是由全局或静态变量中的错误构造函数引起的。

看起来像类 Random的构造函数。

于 2008-12-02T02:36:40.237 回答
0

你有随机类型的全局或静态变量吗?您是否有可能在正确初始化它所在的库之前尝试构建它?

请注意,全局和静态变量的构造顺序不是固定的,并且可能会从调试到发布发生变化。

于 2008-12-02T04:05:45.783 回答
0

您能否更具体地说明您收到的错误?(未处理的异常 std::length 听起来很奇怪——我从没听说过)

据我所知,如果 FLS API 不可用,FlsGetValue 会自动回退到 TLS 对应项。

如果您仍然卡住,请在崩溃时获取您的进程的 .dmp 并将其发布(使用众多免费上传服务中的任何一种 - 并给我们一个链接)(听起来像 SO 中缺少的功能 - 源/数据文件交换?)

于 2008-12-22T12:36:54.830 回答