C ++:你能从静态方法返回局部变量的值吗?

时间:2010-12-06 12:55:22

标签: c++ static

如果我有这样的事情:

static const wchar_t* concatenate(const wchar_t* ws1, const wchar_t* ws2) {
    std::wstring s(ws1);
    s += std::wstring(ws2);
    return s.c_str();
}

它不起作用,因为's'的范围在静态块内,因此堆栈内容将被弹出,而'​​s'的内存地址不再有效,所以我的问题是我该怎么做?

由于

5 个答案:

答案 0 :(得分:12)

更改功能以返回std::wstring而不是wchar_t*,并返回s

static std::wstring concatenate(const wchar_t* ws1, const wchar_t* ws2) {
    std::wstring s(ws1);
    s += std::wstring(ws2);
    return s;
}

顺便说一句,对于非静态方法也是如此。

答案 1 :(得分:5)

函数static这一事实与此无关。如果s.c_str() 变量s可以返回static,但这会非常奇怪,因为s会仅在第一次调用函数时初始化。

我的建议:只需按值返回std::wstring

std::wstring concatenate(const wchar_t* ws1, const wchar_t* ws2) {
    std::wstring s(ws1);
    s += std::wstring(ws2);
    return s;
}

答案 2 :(得分:2)

将return语句替换为以下内容:

wchar_t *ret = new wchar_t[s.length()+1];
wcscpy(ret, s.c_str());
return ret;

您编写的函数不起作用,因为在返回时,会调用局部变量s的析构函数,从而释放s.c_str()指向的内存。

答案 3 :(得分:1)

成员函数(我们在C ++中没有说“方法”)是static并不重要。您可以按值返回本地变量。 不能做的是返回指针或对局部变量的引用,或者返回临时值。 s.c_str()创建指向临时数据或部分本地wstring的指针。所以我们不能回归那个。返回s(并调整返回类型以匹配)很好,因为现在我们按值返回,(从概念上讲,它可能被优化)在返回值中生成堆栈上本地字符串的副本“时隙”。

答案 4 :(得分:0)

如果您想保留功能签名,请尝试以下操作:

static const wchar_t* concatenate(const wchar_t* ws1, const wchar_t* ws2) {

    std::wstring s(ws1);
    wchar_t *r;

    s += std::wstring(ws2);

    /*
    * allocate the return value in heap (with room for the null termination)
    */
    r = new wchar_t[s.length() + 1]; 

    /*** copy ***/
    s.copy(r,s.length()+1);

    return r;
}
顺便说一句(正如其他人所说的那样)你可以返回整个s对象,