例外:访问冲突

时间:2012-12-22 04:33:59

标签: c++ visual-c++

下面的代码有什么问题,以及如何修复它。

#include<iostream>
using namespace std;

template<typename Func1, typename Func2>
class guard{
public:
    guard(Func1 first, Func2 last) : last(last){
        first();
    }
    ~guard(){
        last();
    }
private:
    Func2& last;
};

template<typename Func1, typename Func2>
guard<Func1, Func2> make_guard(Func1 first, Func2 last){
    return guard<Func1, Func2>(first, last);
}

void first(){
    cout << "first" << endl;
}

void last(){
    cout << "last" << endl;
}

int main(){
    {
        first(); // ok
        last(); // ok
        auto g = make_guard(first, last);
        first(); //exception: Access violation
        last(); //exception: Access violation
    }
    first(); // ok
    last(); // ok
    cin.get();
}

在变量first()到期之前,无法调用函数last()g。在VC ++ 2012上编译,在调试和发布模式下都遇到了同样的问题。

1 个答案:

答案 0 :(得分:5)

您的guard保留参考,但需要。一旦guard的构造函数结束,引用就会变为无效,因为它引用构造函数所采用的last参数,而不是传递给{{1}的参数}。

访问无效引用后,您有未定义的行为,并且所有投注均已关闭。