Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在成员变量中存储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 - Fatal编程技术网

在成员变量中存储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_;
    }
};