Умный указатель: сбой во время выполнения в VS 9 под управлением WinXP-Sp3

I am getting run time crash in the following piece of code and not able to debug also. Please review and let me know what's going on.

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

I have include all the headers and the program is compiling fine. This is the error i am getting:

CppConsole.exe — точка входа не найдена Точка входа в процедуру ?_Xweak@tr1@std@@YAXXZ не может быть обнаружена в библиотеке динамической компоновки MSVCP90D.dll

Если я закомментирую эту строку

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

программа работает без сбоев.

Обновление: вопрос можно пока закрыть. Я попытаюсь установить пакет функций VS и посмотреть, будет ли программа выполняться без сбоев.


person John M    schedule 20.01.2011    source источник
comment
У вас отсутствуют списки аргументов шаблона для ваших объектов shared_ptr. Тем не менее, здесь происходит что-то странное. Я не вижу в этом ничего явно неправильного, и если я добавлю #include <memory> и исправлю объявления, у меня не будет проблем с этим кодом в VC10 (в VC9 могла быть проблема, которую вы используете, но это было бы необычно.) Какие настройки вы используете для компиляции этого проекта? Если вы просто скомпилируете этот файл .cpp в командной строке Visual Studio (cl test.cpp или как там называется файл), что произойдет?   -  person James McNellis    schedule 20.01.2011
comment
Я использую VC9, работающий на WinXP SP3. Я включил все заголовки, и компиляция не проблема. Насколько я понимаю, для создания экземпляра общего указателя мне не нужен список аргументов шаблона. Это правильно?   -  person John M    schedule 20.01.2011
comment
Нет, это не так. shared_ptr чего? Вот для чего нужен шаблон. Опубликуйте свой реальный точный код.   -  person GManNickG    schedule 20.01.2011
comment
Это реальный точный код, в котором я пытаюсь понять концепции общего указателя и enable_shared_from_this. Обратите внимание, что создание экземпляра указателя t1 никогда не завершается ошибкой, только когда я пытаюсь создать экземпляр t2 с помощью вызова t1-›shared_from_this(), программа вылетает.   -  person John M    schedule 20.01.2011
comment
Если вы не возражаете, я хотел бы увидеть точный, от начала до конца, файл .cpp, который компилируется без списка аргументов шаблона для shared_ptr. Я очарован тем, что это сработает.   -  person James McNellis    schedule 20.01.2011
comment
@James: теперь я обновил весь код. Только 1 приложение файловой консоли cpp.   -  person John M    schedule 20.01.2011
comment
@Джеймс: извини. На самом деле код имеет список аргументов шаблона. Плохо, что я плохо разбираюсь в html, поэтому код пропустил аргумент. Это именно тот фрагмент кода, который компилируется.   -  person John M    schedule 21.01.2011


Ответы (4)


Погуглил (точка входа в процедуру ?_Xweak), нашел это: http://blog.nilretain.org/

РЕДАКТИРОВАТЬ: я успешно собрал и запустил его на своем msvc 2008 на xp-sp3, который имеет более позднюю версию msvcp90d.dll. Возможно, вы можете загрузить и установить последнюю редист-версию msvc90 и пересобрать.

РЕДАКТИРОВАТЬ: ваши зависимости говорят, что чего-то не хватает. Проверь это :

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

person engf-010    schedule 20.01.2011
comment
Спасибо Эдвин. у меня не установлен пакет обновления VS. Но по вашей ссылке я скомпилировал с помощью макроса _BIND_TO_CURRENT_CRT_VERSION, но теперь он жалуется на неправильную конфигурацию приложения. Я не могу сделать из этого головы или решки. Этот фрагмент кода действительно действителен, и его можно найти на сайте MSDN. - person John M; 20.01.2011
comment
@John M: очень плохо, это не сработало. Погуглил. Я получил 132 результата поиска, о котором я упоминал. Я думал, что тот, который я цитировал, был общим решением. Но я был неправ. - person engf-010; 20.01.2011
comment
@John M: перейдите по ссылке на msdn.microsoft.com/en-us/ library/cc664727.aspx, возможно, вы должны определить его как #define _BIND_TO_CURRENT_CRT_VERSION 1 - person engf-010; 20.01.2011
comment
установим пакет функций VS и посмотрим, что произойдет. - person John M; 21.01.2011
comment
Привет, ребята, просто к вашему сведению мой пост в блоге, на который вы сейчас ссылаетесь, находится здесь: devjustinian.com/2009 /12/manifest-gotchas.html (на случай, если он прокручивается за пределы страницы). Первоначально я понял это на основе манифеста. Версия CRT, которую он запрашивает, с версией CRT, установленной в C:\windows .. HTH! - person justinian; 08.02.2011

Вам нужен аргумент шаблона:

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

Компилятор должен сообщить об ошибке, если ее нет. (Visual C++ 2010 делает)

person Volker Voecking    schedule 20.01.2011
comment
С программой все в порядке, и экземпляр t1 создается до тех пор, пока я не добавлю следующую строку, в которой я пытаюсь вызвать shared_from_this(), когда программа вылетает с указанной ошибкой. - person John M; 20.01.2011
comment
Хорошо, не могли бы вы проверить, какая версия MSVCP90D.dll используется при запуске приложения? (используя depend.exe) У меня версия 9.0.30729.1, и она включает точку входа в процедуру ?_Xweak@tr1@std@@YAXXZ. - person Volker Voecking; 20.01.2011
comment
Версия MSVCP90D.dll загружалась при сбое 9.0.21022.8. Обходчик зависимостей пожаловался на эту ошибку: по крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в неявно зависимом модуле. - person John M; 20.01.2011
comment
@John M: вы должны видеть, где это происходит. - person MSalters; 20.01.2011

Похоже, ваш компилятор не связывается с DLL с необходимыми функциями времени выполнения. Например, если вы добавили заголовки в свой путь включения, но не ссылаетесь на последнюю версию среды выполнения C++ (проверьте настройки своего проекта) или устанавливаете пакет функций Visual C++ 2008 не работает, или вы установили пакет функций, но затем пытался скомпилировать из Visual Studio 2005 и т.д.

В основном шаг «обработать исходный код (включая заголовки)» работает нормально, но шаг «связать все библиотеки DLL» не работает. И это не удается, потому что среда выполнения, с которой вы связываетесь, не имеет необходимых функций для shared_ptrs или weak_ptrs.

person Max Lybbert    schedule 20.01.2011
comment
Хорошо, какие файлы lib мне нужно связать, чтобы умный указатель работал - person John M; 20.01.2011
comment
Shared Pointer и enable_shared_from_this не нуждаются в пакете функций Visual Studio C++ 2008, поскольку они уже определены в пространстве имен Technology Review TR1. Я не устанавливал пакет функций. Проблема с кодом в строке, где я вызываю shared_from_this(). Кроме того, вся программа работает нормально. - person John M; 20.01.2011
comment
Они определены в TR1, но Visual Studio 2008 не поставляется с TR1. Вам нужно не только установить пакет функций на свой компьютер, но и установить распространяемый пакет на все компьютеры, на которых вы хотите запустить программу. Я работаю в компании, которая занимается именно этим. Кроме того, вы увидите на странице, на которую я дал ссылку, этот пакет функций также включает реализацию TR1. ... Наша реализация включает в себя ряд важных функций, таких как ... Умные указатели. Подсказка: пакет компонентов существует, поскольку TR1 не является частью базовой установки 2008 года. - person Max Lybbert; 20.01.2011
comment
Я не знаю, какие файлы lib вам нужны, но они являются частью пакета функций. Другая возможность заключается в том, что вы каким-то образом установили пакет функций, добавили включаемые файлы в путь включения, но не добавили библиотеки DLL в путь компоновщика. - person Max Lybbert; 20.01.2011

У меня была эта проблема при разработке под M$ Windows SP3 с M$ Visual Studio 2008. Я перепробовал и объединил множество подсказок, которые смог найти в сети. Но безрезультатно. Решение было простым, мне пришлось установить пакет SP1 для M$ Visual Studio 2008!

Дело в том, что мои внешние библиотеки DLL использовали функции C++ TR1, о которых я не знал. M$ Visual Studio 2008 без SP не имеет правильных библиотек DLL времени выполнения.

Итак, просто убедитесь, что у вас есть этот SP1 для вашей M$ Visual Studio 2008, прежде чем пробовать любое другое решение.

person Vladislavs Dovgalecs    schedule 25.09.2013