我有两个问题。这两个都可以用这个简单的代码来说明(用g ++ -Wall -O2 -std = c ++ 14编译):
#include <string>
using namespace std;
const char *printi(const unsigned long &i) {
return to_string(i)).c_str();
}
int main() {
unsigned long i1 = 1; unsigned long i2 = 2;
fprintf(stderr, "%s%s\n", printi(i1), printi(i2));
}
问题没有。 1 - 打印“11”,同时打印“12”。
问题没有。 2 - 有时它根本不打印数字,而是一些奇怪的字符。
答案 0 :(得分:4)
请注意,std::to_string()
会返回std::string
。此std::string
仅存在于printi()
函数范围内,这意味着当您退出函数时(当您return
时),将调用此std::string
的析构函数,并且您返回的地址(c_str()
返回的值)不再指向有效内存。您的代码具有未定义的行为,因为您不知道它现在指向哪些数据。
为了解决这个问题,您可以让printi()
返回std::string
,这将在return
后深深复制到调用者,然后调用者可以使用{{1}根据需要:
c_str()