这是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;
}
答案 0 :(得分:2)
可以为您解决的随机想法:
我没有看到更多选项,没有更改代码以在构造函数/析构函数中不使用dynamic_cast,并且完全删除/ vd2
答案 1 :(得分:2)
我已经更新了我的博客文章,其中包含此讨论的链接以及代码的改编版本,以说明问题。我对“这似乎工作正常”的初步结论仍然存在,因为Gtk还没有在我身上崩溃,但问题显然仍然存在并且可以随时出现。
因为您的代码是重现问题的简化示例,所以我不能为您的特定情况提供解决方法,除了您可能不想做的事情(更改编译器,不使用dynamic_cast等)
据我所知,/ vd2和标准库的某些部分是不兼容的。你将无法按照自己的方式完成这项工作。你需要抛弃一个或另一个。
编辑:您编辑了自己的问题,建议将sstream包装到不使用/ vd2编译的不同翻译单元中,并修改代码以使用该包装。这将为您提供两个或多个使用不同标志编译的转换单元,这些标志会影响二进制接口。您正试图通过使用实现定义和脆弱的方法来解决编译器错误。虽然它可能有用,但我不相信它。