cout返回一个字符串

时间:2017-03-03 16:14:17

标签: c++ string cout

所以我的班级名为array,我希望将其作为格式化字符串返回,如下所示:[first, second, third, ..., last]。现在我编写了试图这样做的方法:

std::string& array::to_string()
{
    char buffer[1];
    std::string s("[");
    for (auto &x: *this)
    {
        if (&x == this->end()) s += _itoa_s(x, buffer, 10) + "]";
        else s += _itoa_s(x, buffer, 10) + ",";
    }
    return s;
}

是的,我已经加入了<string>。现在,在我的程序的其他部分,我使用std::cout << myArray.to_string() << '\n'。我得到的错误(在执行期间)只是Visual Studio将我扔到stdlib.h标题并显示它的一部分:

__DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_1(
    _Success_(return == 0)
    errno_t, _itoa_s,
    _In_ int,  _Value,
         char, _Buffer,
    _In_ int,  _Radix
    )

我做错了什么?

3 个答案:

答案 0 :(得分:4)

字符串s是函数to_string的本地字符串,其析构函数在to_string返回时运行,因此返回并使用对已经被破坏的字符串的引用会创建 undefined行为。返回按值代替:

std::string array::to_string() const
{
    // a more robust, C++-style implementation...
    std::ostringstream oss;
    size_t n = 0;
    for (const auto& x: *this)
        oss << (n++ ? ',' : '[') << x;
    oss << ']';
    return oss.str();
}

答案 1 :(得分:3)

您正在返回对array::to_string()方法中作用域的std :: string的引用。

当方法退出时,本地s变量超出范围,因此它被销毁,导致返回“dangling reference”。

您应该按值返回字符串:

std::string array::to_string()

或将其作为参考参数传递:

void array::to_string(std::string& result)

答案 2 :(得分:2)

您正在返回对本地对象的引用。因此,您尝试使用已从堆栈中释放的对象。从函数签名中删除&以按值返回。