【问题标题】:Smart pointer: runtime crash in VS 9 running WinXP-Sp3智能指针:运行 WinXP-Sp3 的 VS 9 中的运行时崩溃
【发布时间】:2011-01-20 07:02:21
【问题描述】:

我在以下代码中遇到运行时崩溃,也无法调试。请查看并让我知道发生了什么。

// CppConsole.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <assert.h> class Test : public std::tr1::enable_shared_from_this<Test> { public: Test():x(0),y(0),z(0){}; int x; float y; double z; };
int _tmain(int argc, _TCHAR* argv[])
{
    std::tr1::shared_ptr<Test> t1(new Test);
    std::tr1::shared_ptr<Test> t2 = t1->shared_from_this();
    return 0;
}

我已经包含了所有标题,并且程序编译正常。这是我得到的错误:

CppConsole.exe - 未找到入口点 过程入口点 ?_Xweak@tr1@std@@YAXXZ 找不到动态链接 库 MSVCP90D.dll

如果我注释掉这一行

std::tr1::shared_ptr t2 = t1->shared_from_this();

程序运行没有崩溃。

更新:问题可以暂时关闭。我将尝试安装 VS 功能包并查看程序执行时没有任何崩溃的天气。

【问题讨论】:

  • 您缺少 shared_ptr 对象的模板参数列表。即便如此,这里还是发生了一些奇怪的事情。我看不出有什么明显的错误,如果我添加 #include &lt;memory&gt; 并修复声明,我在 VC10 下的这段代码没有问题(可能在 VC9 中存在问题,这a 您正在使用,但那将是不寻常的。)您使用什么设置来编译这个项目?如果你只是在 Visual Studio 命令行上编译这个 .cpp 文件(cl test.cpp 或任何文件名),会发生什么?
  • 我使用的是在 WinXP SP3 上运行的 VC9。我已经包含了所有标题,编译不是问题。据我所知,创建共享指针的实例我不需要模板参数列表。这是正确的吗?
  • 不,不是。 shared_ptr 什么?这就是模板的用途。发布您真实的确切代码。
  • 这是我试图理解共享指针和 enable_shared_from_this 概念的真正确切代码。请注意,创建 t1 指针的实例永远不会失败,只有当我尝试使用调用 t1->shared_from_this() 创建实例 t2 时,程序才会崩溃。
  • 如果您不介意,我想看看确切的、从头到尾的 .cpp 文件,它在没有 shared_ptr 的模板参数列表的情况下编译。我很着迷这会奏效。

标签: c++ smart-pointers tr1


【解决方案1】:

谷歌搜索(程序入口点?_Xweak),发现:http://blog.nilretain.org/

编辑:我在 xp-sp3 上的 msvc 2008 上成功构建并运行它,它具有更高版本的 msvcp90d.dll。 也许您可以下载并安装最新的 msvc90 redist-version 并重新构建。

编辑:您的依赖项说缺少某些内容。看看这个:

http://answers.yahoo.com/question/index?qid=20090623140325AAInugo

【讨论】:

  • 谢谢埃德温。我没有安装 VS 服务包。但是按照您的链接,我使用宏_BIND_TO_CURRENT_CRT_VERSION 编译但现在它抱怨应用程序配置不正确。我无法从中做出正面或反面。这段代码实际上是有效的,可以在 MSDN 站点找到。
  • @John M:太糟糕了,它没有用。已经谷歌了。通过我提到的搜索,我得到了 132 个结果。我认为我引用的那个是一个通用的解决方案。但我错了。
  • @John M:点击msdn.microsoft.com/en-us/library/cc664727.aspx的链接,也许你必须将其定义为#define _BIND_TO_CURRENT_CRT_VERSION 1
  • 将安装 VS 功能包,看看会发生什么。
  • 嘿,伙计们,仅供参考,我的博客文章链接到你现在住在这里:devjustinian.com/2009/12/manifest-gotchas.html(以防它滚出页面)我最初是根据清单想出来的。如果事情进展顺利对你来说奇怪的是,尝试让 VS 生成一个外部清单并将它要求的 CRT 版本与安装在 C:\windows .. HTH 下的 CRT 版本进行比较!
【解决方案2】:

你需要一个模板参数:

std::tr1::shared_ptr<Test> t1(new Test);
std::tr1::shared_ptr<Test> t2 = t1->shared_from_this();

如果不存在,编译器应该报告错误。 (Visual C++ 2010 有)

【讨论】:

  • 程序很好,正在创建 t1 实例,直到我添加尝试调用 shared_from_this() 的下一行,这是程序因上述错误而崩溃的时候。
  • 好的,您能在运行应用程序时检查正在使用的 MSVCP90D.dll 版本吗? (使用depends.exe)我的版本是9.0.30729.1,其中包含过程入口点?_Xweak@tr1@std@@YAXXZ。
  • MSVCP90D.dll 崩溃时加载的版本为 9.0.21022.8。 Dependency walker 抱怨此错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。
  • @John M:你应该能够看到发生了什么。
【解决方案3】:

您的编译器似乎没有链接到具有所需运行时函数的 DLL。例如,如果您将标头添加到包含路径,但未链接到最新版本的 C++ 运行时(检查您的项目设置),或者安装 the Visual C++ 2008 feature pack 不起作用,或者您安装了功能包但然后尝试从 Visual Studio 2005 等编译。

基本上“处理源代码(包括标题)”步骤工作正常,但“链接所有 DLL”步骤失败。它失败了,因为您链接的运行时没有shared_ptrs 或weak_ptrs 所需的功能。

【讨论】:

  • 好的,我需要链接哪些 lib 文件才能使智能指针工作
  • 共享指针和 enable_shared_from_this 不需要 Visual Studio C++ 2008 功能包,因为它们已在 Technology Review TR1 命名空间中定义。我还没有安装功能包。代码的问题在于我调用 shared_from_this() 的地方。除此之外,整个程序运行良好。
  • 它们在 TR1 中定义,但 Visual Studio 2008 没有随 TR1 提供。您不仅需要在您的计算机上安装功能包,还必须在要运行该程序的所有计算机上安装可再发行组件。我在一家正是这样做的公司工作。另外,您会在我链接到的页面上看到“此功能包还包括 TR1 的实现......我们的实现包括许多重要的功能,例如......智能指针。”提示:功能包存在,因为 TR1 不是 2008 基本安装的一部分。
  • 我不知道您需要哪些 lib 文件,但它们是功能包的一部分。另一种可能性是您以某种方式安装了功能包,将包含文件添加到包含路径但没有将 DLL 添加到链接器路径。
【解决方案4】:

我在使用 M$ Visual Studio 2008 在 M$ Windows SP3 下开发时遇到了这个问题。我尝试并结合了许多我可以在网上找到的提示。无济于事。解决方法很简单,我必须为 M$ Visual Studio 2008 安装 SP1 包!

问题是我的外部 DLL 使用了我不知道的 C++ TR1 函数。没有 SP 的 M$ Visual Studio 2008 没有正确的运行时 DLL。

所以,在尝试任何其他解决方案之前,请先确保您拥有 M$ Visual Studio 2008 的 SP1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多