在成员变量中存储std::to_string(x).c_str()会产生垃圾 我有这个非常简单的C++程序: using namespace std; class TheClass { private: const char *_numberString; public: TheClass(int number) { _numberString = to_string(number).c_str(); } operator const char *() { return _numberString; } }; int main(int argc, const char * argv[]) { TheClass instance = 123; cout << (const char *)instance << endl; return 0; }
它像应该的那样记录在成员变量中存储std::to_string(x).c_str()会产生垃圾 我有这个非常简单的C++程序: using namespace std; class TheClass { private: const char *_numberString; public: TheClass(int number) { _numberString = to_string(number).c_str(); } operator const char *() { return _numberString; } }; int main(int argc, const char * argv[]) { TheClass instance = 123; cout << (const char *)instance << endl; return 0; },c++,xcode,C++,Xcode,它像应该的那样记录123。我看不出我做错了什么。即使我将123更改为另一个数字,也会记录完全相同的内容。c_str的返回值仅在字符串在范围内(且未更改)时有效。您的匿名临时用户在语句末尾超出范围 考虑将std::string作为成员变量而不是指针类型,或者存储数值本身。c\u str()返回指向其调用的std::string实例缓冲区的指针。std::to_string()返回的对象是临时对象,在构造函数体的末尾被销毁。这使得\u numberString指向一个已被销毁的对象 第二段代码不必工
123
。我看不出我做错了什么。即使我将123更改为另一个数字,也会记录完全相同的内容。c_str的返回值仅在字符串在范围内(且未更改)时有效。您的匿名临时用户在语句末尾超出范围
考虑将std::string作为成员变量而不是指针类型,或者存储数值本身。c\u str()
返回指向其调用的std::string
实例缓冲区的指针。std::to_string()
返回的对象是临时对象,在构造函数体的末尾被销毁。这使得\u numberString
指向一个已被销毁的对象
第二段代码不必工作。你的问题和第一个一样。它工作的事实是未定义行为的影响。此时
_numberString = to_string(number).c_str();
您正在存储一个指向临时std::string
值的内部数据的指针,该值在该行代码之后无效
访问\u numberString
会有效地调用未定义的行为
如注释中所述,没有必要将
\u numberString
1成员保留为const char*
。改用std::string
成员:
class TheClass {
private:
std::string numberString_;
public:
TheClass(int number) : numberString_(to_string(number)) {
}
operator const std::string& () {
return numberString_;
}
};
1) 对于类成员名称,不应该使用前缀
。
,这是为编译器和标准实现内部函数保留的。如果您不喜欢像m
这样的模式或其他前缀约定(如我),只需使用后缀
,如我的示例所示。
绝对没有任何理由求助于
char*
。operator@Cyber我看不出问答真的是个骗局。实际上,我愿意就此结束这个问题,但相关问题至少没有提供MCVE,而这个问题确实如此。此外,所描述的情况略有不同,从给出的答案来看,实际情况甚至不明显。
class TheClass {
private:
std::string numberString_;
public:
TheClass(int number) : numberString_(to_string(number)) {
}
operator const std::string& () {
return numberString_;
}
};