【问题标题】:exception: Access violation异常:访问冲突
【发布时间】:2012-12-22 04:33:59
【问题描述】:

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

#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 编译,在调试和发布模式下都遇到了同样的问题。

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    您的guard 保留一个引用,但它需要一个。只要guard 的构造函数结束,reference 就会失效,因为它引用构造函数采用的last 参数,而不是传递给make_guard 的参数。

    一旦你访问了一个无效的引用,你就有未定义的行为,所有的赌注都被取消了。

    【讨论】:

    • 谢谢。已经修好了。但是我还是不明白为什么在变量g没有过期的情况下调用函数first()last()直接失败了。
    • firstlast不是全局函数的地址吗?为什么它们会失效?
    • @user93353: firstlast 全局函数的地址,但是复制它们可以获得指向这些函数的本地指针。对指向该地址的指针的临时副本的引用变得无效。
    • 好的 - 没有注意到私人成员 last 是一个参考。简单的解决方法是不将其作为参考。 Func2 last
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多