如果我有这样的事情:
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'的内存地址不再有效,所以我的问题是我该怎么做?
由于
答案 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对象,