为什么在此处重写字符串文字(C++)?

use*_*466 4 c++

我有一个持有指针的类。我在这里只包含了骨架代码。类构造函数需要一个字符串。

#include <iostream>
#include <string>

using namespace std;

class slice {
public:
slice(string s):
    data_(s.data()),
    size_(s.size()) {}

    const string toString() {
        string res(data_, data_+size_);
        return res;
    }

private:
    const char* data_;
    const size_t size_;
};

int main() {

    slice a{"foo"};
    slice b{"bar"};


    cout << a.toString() << endl;
    cout << b.toString() << endl;
}
Run Code Online (Sandbox Code Playgroud)

这个程序的输出是:

$ g++ test.cpp && ./a.out 
bar
bar
Run Code Online (Sandbox Code Playgroud)

我期待

foo
bar
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?对象a持有的指针是如何被覆盖的?

rus*_*tyx 5

这里发生了什么?对象a持有的指针是如何被覆盖的?

您遇到未定义的行为

slice(string s):
    data_(s.data()),
    size_(s.size()) {}
Run Code Online (Sandbox Code Playgroud)

string s是输入字符串的副本,并在构造函数的持续时间内有效。因此s.data()在构造函数完成后悬挂。