以我的理解,将本地内存的地址存储在全局容器中是不可能的,因为本地变量最终会被销毁。
class AA {
std::string name;
public:
explicit AA(std::string n) : name(n) {}
std::string getName() const {
return name;
}
};
class Y {
std::vector<std::reference_wrapper<AA>> x;
public:
void addAA(AA& aa) {
x.emplace_back(aa);
}
AA& getLastA() {
return x.back();
}
};
void foobar(Y& y) {
AA aa("aa");
y.addAA(aa);
}
int main() {
Y y;
foobar(y);
std::cout << y.getLastA().getName() << std::endl; // error - probably because the local aa has been destroyed.
return 0;
}
但是,我不明白为什么这段代码有效:
void foobar(Y& y, AA& aa) {
y.addAA(aa);
}
int main() {
Y y;
{
AA aa("aa");
foobar(y,aa);
}
std::cout << y.getLastA().getName() << std::endl;
return 0;
}
aa
再次在另一个作用域中创建,应该销毁。但是,稍后可能会在main
. 该代码工作正常。
为什么我们不会在第二种情况下得到错误?
以我的理解,将本地内存的地址存储在全局容器中是不可能的,因为本地变量最终会被销毁。
你是从一个有缺陷的理解开始的。将局部变量的地址保留在其生命周期之外当然是一个坏主意,但它仍然是可能的。正如您所说,这是一个坏主意,因为该指针很快就会失效。即便如此,您可以获取任何变量的地址,并且该语言不会阻止您将其存储在您喜欢的任何位置。和之前的 C 一样,C++ 允许你做很多不好的事情,所以要小心。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句