在全局容器中存储局部变量的内存地址

空值

以我的理解,将本地内存的地址存储在全局容器中是不可能的,因为本地变量最终会被销毁。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章