我正在尝试看起来不错的const_string lib,但它在运行时因访问冲突而崩溃(atomic_count,operator ++())。测试代码:
#include <boost/const_string/const_string.hpp>
#include <boost/const_string/concatenation.hpp>
typedef boost::const_string<wchar_t> wcstring;
class Test
{
private:
const wcstring &s1;
const wcstring &s2;
public:
Test()
: s1(L"")
, s2(L"")
{
}
const wcstring &GetS1()
{
return s1;
}
const wcstring &GetS2()
{
return s2;
}
};
Test t;
int _tmain(int argc, _TCHAR* argv[])
{
//Test t;
wcstring t1 = t.GetS1(); // crashes here
wcstring t2 = t.GetS2();
return 0;
}
只有在t是全局的时候崩溃才会崩溃。如果我将声明移动到main(),那没关系。 系统:VS 2010,升级版本1.47.0
问题:我做错了什么或是库/编译器的问题? 有人可以为C ++推荐更稳定的不可变字符串实现吗?
答案 0 :(得分:6)
您的Test
实例已将其引用数据成员初始化为对从文字L""
创建的临时对象的引用。
糟糕。当您尝试在崩溃的行中wcstring
的复制构造函数中使用其中一个时,临时值不再存在,因此您的引用不会引用任何内容。
我认为boost::const_string
几乎总是被价值所使用,这就是它的用途。