C ++变量的生命周期

时间:2016-03-06 00:18:37

标签: c++ pass-by-reference

下面是我想要做的事情的抽象。 Main函数依次调用 f1 f2 。在 f1 中,它构造一个局部变量 t ,然后使用 t 调用非阻塞函数,其中回调捕获 t 的const引用。在回调执行之前, f1 可能已经返回, t 已销毁。我认为在这种情况下,回调在调用时会保持无效的 t 。我写了一个测试来模拟 f2 回调执行之前完成的情况。看起来很好。我是否误解了有关C ++的任何内容?

void Main() {
  f1();
  f2();
}

void f1() {
  T t(...);
  nonBlocking(t, Closure(callback, t));
}    

void callback(const T& t) {
  // do something with t
}

struct T {
  int* a;
  string* b;
  ...
}

2 个答案:

答案 0 :(得分:1)

不,你的理解是正确的。你必须避免这样的错误的原因是它们使代码变得不可预测。您已经证明了这一点,因为无法像预期的那样预测代码的行为。

答案 1 :(得分:1)

代码似乎可以正常工作,但这实际上只是一种可能在任何时候都会破碎的错觉。

会发生什么是T存在于堆栈中。一旦f1返回,该空间是免费的,可以用于其他东西。在这一点之后使用悬空引用是未定义的行为,虽然这可能意味着它偶尔会起作用,但它也可能意味着它将以任何方式随机失败。

换句话说,不要这样做。