示例中的 C++ 字符串和字符*差异

C++ string and char* difference in example

提问人:Sandro Jijavadze 提问时间:7/24/2022 更新时间:7/24/2022 访问量:61

问:

这是来自hackerrank的“继承代码”的例子,

虽然这有效并返回,如果我注释返回并取消注释,则当前注释的部分将返回垃圾。what()nwhatwhat()

它们在我看来是一样的,有什么区别?

/* Define the exception here */
struct BadLengthException : public exception {      
    public: 
    int num;
    string stra;
    BadLengthException(int n){
        this->num = n;
        this->stra = to_string(this->num);
    };
    
   const char * what () const throw () {

       return this->stra.c_str();


       //string a = to_string(this->num);
       //return  a.c_str();
   }
};
C++ 指针 char std c-strings

评论

1赞 john 7/24/2022
关键的区别在于两个实体的生存期。 退出时不再存在,但存在,因为它是对象的一部分,而不是方法中的局部变量。awhatstrawhat

答:

7赞 lorro 7/24/2022 #1

string a是 中的本地 (ASDV)。当您返回时,它超出了范围。 只是一个指针,它是非所有权的,因此不会延长 char 缓冲区的生存期,因此它是 UB。在UB的情况下,任何事情都可能发生,包括归还垃圾。what()a.c_str()

评论

1赞 QuentinUK 7/24/2022
我的版本是不完整和不可信的,没有这个首字母缩略词。
1赞 lorro 7/24/2022
@QuentinUK ASDV 是自动存储持续时间变量,但该标准的名称是指通常所说的“局部”变量。
0赞 Sandro Jijavadze 7/25/2022
这就解释了,谢谢。知道为什么我的问题被否决了吗?
1赞 lorro 7/25/2022
@SandroJijavadze 不是我。虽然这是一个基本问题,但我认为这也是一个完全有效的问题。也许有些人忘记了他们问这样的问题......