1

我正在尝试看起来不错的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,boost v. 1.47.0

问题:我做错了什么还是库/编译器的问题?有人可以推荐一个更稳定的 C++ 不可变字符串实现吗?

4

1 回答 1

6

您的实例已将其引用Test数据成员初始化为对从文字创建的临时对象的引用。L""

哎呀。当您尝试在崩溃行的复制构造函数中使用其中一个时,这些临时对象不再存在wcstring,因此您的引用不会引用任何内容。

我认为boost::const_string应该几乎总是按价值使用,这就是它的用途。

于 2011-09-02T09:15:57.563 回答