下面是我想要做的事情的抽象。 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;
...
}
答案 0 :(得分:1)
不,你的理解是正确的。你必须避免这样的错误的原因是它们使代码变得不可预测。您已经证明了这一点,因为无法像预期的那样预测代码的行为。
答案 1 :(得分:1)
代码似乎可以正常工作,但这实际上只是一种可能在任何时候都会破碎的错觉。
会发生什么是T存在于堆栈中。一旦f1返回,该空间是免费的,可以用于其他东西。在这一点之后使用悬空引用是未定义的行为,虽然这可能意味着它偶尔会起作用,但它也可能意味着它将以任何方式随机失败。
换句话说,不要这样做。