如何解决此Visual Studio编译器BUG?

时间:2011-12-09 15:33:50

标签: c++ visual-studio visual-c++ compiler-construction

这是visual studio中的“着名”/ vd2错误,更多信息来自: http://mcdougalljonathan.blogspot.com/2011/12/visual-c-2010-stdistringstream-crash-in.html 或谷歌搜索“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";
}

修改

我有一个想法...所以我想将每个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 个答案:

答案 0 :(得分:2)

可以为您解决的随机想法:

  1. 请勿使用VS2010(坚持使用2008版)
  2. 使用不同的STL(可能非常痛苦,取决于您的使用情况,但从我收集的内容来看,问题来自2010年的STL)。
  3. 我没有看到更多选项,没有更改代码以在构造函数/析构函数中不使用dynamic_cast,并且完全删除/ vd2

答案 1 :(得分:2)

我已经更新了我的博客文章,其中包含此讨论的链接以及代码的改编版本,以说明问题。我对“这似乎工作正常”的初步结论仍然存在,因为Gtk还没有在我身上崩溃,但问题显然仍然存在并且可以随时出现。

因为您的代码是重现问题的简化示例,所以我不能为您的特定情况提供解决方法,除了您可能不想做的事情(更改编译器,不使用dynamic_cast等)

据我所知,/ vd2和标准库的某些部分是不兼容的。你将无法按照自己的方式完成这项工作。你需要抛弃一个或另一个。

编辑:您编辑了自己的问题,建议将sstream包装到不使用/ vd2编译的不同翻译单元中,并修改代码以使用该包装。这将为您提供两个或多个使用不同标志编译的转换单元,这些标志会影响二进制接口。您正试图通过使用实现定义和脆弱的方法来解决编译器错误。虽然它可能有用,但我不相信它。