Как я могу обойти эту ошибку компилятора Visual Studio? - PullRequest
2 голосов
/ 09 декабря 2011

Это «знаменитая» ошибка / vd2 в visual studio, больше информации, например: http://mcdougalljonathan.blogspot.com/2011/12/visual-c-2010-stdistringstream-crash-in.html или Google для ключевых слов "visual studio vd2 gtkmm" ..

Итак, я должен выпустить выпуск с кодом, который содержит множество этих шаблонов ниже с VS2010. Похоже, невозможно, у меня осталось 10 дней. Есть идеи?

#include <iostream>
#include <sstream>

struct Object
{
  virtual ~Object() {}
};

struct Base: virtual public Object
{
  Base() :Object()
  {
    // upcast and downcast
    Object* o = static_cast<Object*>(this);
    Base*   b = dynamic_cast<Base*>(o);
    std::cout << "  this: " << this << " after cast: " << b;
    // should be the same address
    if ( this != b)
      std::cout << " check address: NOK";
    else
      std::cout << " check address: OK ";
  }
};

struct Derived: public Base
{
  int i;
};

int main()
{
  Derived d;
  std::cout << " end arrived: ";
  std::stringstream* ss = new std::stringstream;
  delete ss;
  std::cout << "OK";
}

EDIT

У меня есть идея ... Итак, я хочу заменить каждый std :: stream на обертку, например. std2 :: stream, где я динамически распределяю их по интеллектуальному ptr и компилирую эту реализацию-обертку без ключа / vd2. Я попробую на следующий день ...

Итак, я хочу что-то вроде этого

// compile without /vd2
#include <sstream>
#include <iostream>
#include <boost/scoped_ptr.hpp>

namespace std2
{
    class stringstream
    {
        public:
            stringstream()
            {
                m_stream.reset(new std::stringstream);
            }
            template<typename T>
            std::stringstream& operator<<(const T& param)
            {
                *m_stream << param;
                return *m_stream;
            }

            std::string str() const
            { return m_stream->str(); }
        private:
            boost::scoped_ptr<std::stringstream> m_stream;

    };
}

int main()
{
    std2::stringstream stream;
    stream << "DDDD" << std::endl;
    std::cout << stream.str() << std::endl;
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Я обновил свой блог с ссылкой на это обсуждение и адаптированной версией вашего кода, чтобы проиллюстрировать проблему.Мой первоначальный вывод о том, что «это, похоже, работает нормально», все еще остается в силе, поскольку в Gtk я еще не столкнулся, но проблема, очевидно, все еще присутствует и может проявиться в любое время.

Поскольку ваш код являетсяВ упрощенном примере, чтобы воспроизвести проблему, я не могу дать обходной путь для вашего конкретного случая, за исключением вещей, которые вы, вероятно, не захотите делать (смените компилятор, не используйте dynamic_cast и т. д.)

Из чегоЯ понимаю, что / vd2 и части стандартной библиотеки несовместимы.Вы не сможете сделать эту работу так, как вы хотите.Вам нужно будет отказаться от одного или другого.

edit : Вы отредактировали свой вопрос, предложив обернуть потоки в другой модуль перевода, скомпилированный без / vd2, и изменить свой код, чтобы использовать егообертка.Это даст вам два или более модулей перевода, скомпилированных с разными флагами, которые влияют на двоичный интерфейс.Вы пытаетесь обойти ошибки компилятора, используя методы реализации и хрупкие методы.Хотя это может сработать, я бы не стал доверять.

2 голосов
/ 09 декабря 2011

Случайные идеи, которые могут решить эту проблему для вас:

  1. Не используйте VS2010 (придерживайтесь версии 2008 для вашего выпуска)
  2. Используйте другой STL (потенциально очень болезненный, в зависимости отна вашем использовании, но из того, что я понял, проблема связана с STL, включенным в 2010).

Я не вижу много других вариантов, за исключением изменения кода, чтобы не использовать dynamic_cast в конструкторах/ деструкторы, и удаление / vd2 в целом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...