【发布时间】:2017-09-19 19:45:05
【问题描述】:
我有一个返回std::string 的函数。我将它传递给printf 并创建了一个辅助函数,该函数使用公共参数调用该函数并返回std::string 中的c 字符串指针。每次通话我都会得到相同的指针。我认为这与临时寿命有关。如果可能的话,我想解决这个问题并使其安全。
#include <stdio.h>
#include <string>
std::string intToString(int num) {
char buf[100];
snprintf(buf, sizeof(buf), "%d", num);
return buf;
}
const char *helper(int num, int increment) {
return intToString((num + increment) * 10).c_str();
}
int main() {
for (int i=1; i < 5; i++) {
printf("- %d: %3s %3s %3s %3s\n", i,
intToString((i + 0) * 10).c_str(),
intToString((i + 1) * 10).c_str(),
intToString((i + 2) * 10).c_str(),
intToString((i + 3) * 10).c_str()
);
printf("+ %d: %3s %3s %3s %3s\n", i,
helper(i, 0),
helper(i, 1),
helper(i, 2),
helper(i, 3)
);
}
return 0;
}
输出:
- 1: 10 20 30 40
+ 1: 10 10 10 10
- 2: 20 30 40 50
+ 2: 20 20 20 20
- 3: 30 40 50 60
+ 3: 30 30 30 30
- 4: 40 50 60 70
+ 4: 40 40 40 40
【问题讨论】:
-
return intToString((num + increment) * 10).c_str();- 支持该指针的std::string在调用者获得地址时已经消失。您的程序调用未定义的行为。第一种情况下临时的生命周期延长。在第二种情况下,唯一临时保留的是一个悬空指针。