我有一个持有指针的类。我在这里只包含了骨架代码。类构造函数需要一个字符串。
#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持有的指针是如何被覆盖的?
这里发生了什么?对象a持有的指针是如何被覆盖的?
您遇到未定义的行为。
slice(string s):
data_(s.data()),
size_(s.size()) {}
Run Code Online (Sandbox Code Playgroud)
这string s是输入字符串的副本,并在构造函数的持续时间内有效。因此s.data()在构造函数完成后悬挂。