智能指针:运行WinXP-Sp3的VS 9中的运行时崩溃

时间:2011-01-20 07:02:21

标签: c++ smart-pointers tr1

我在下面的代码中遇到运行时崩溃而且无法调试。请查看并告诉我发生了什么。

// 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

如果我注释掉这一行

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;
}

程序运行时没有崩溃。

更新:问题暂时无法解决。我将尝试安装VS功能包并查看程序执行的天气,而不会发生任何崩溃。

4 个答案:

答案 0 :(得分:2)

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

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

编辑:您的依赖关系表示缺少某些内容。看看这个:

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

答案 1 :(得分:1)

您需要一个模板参数:

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

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

答案 2 :(得分:0)

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

基本上“处理源代码(包括头文件)”步骤工作正常,但“链接所有DLL”步骤失败。它失败了,因为您链接的运行时没有shared_ptrweak_ptr所需的函数。

答案 3 :(得分:0)

使用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。