2012-12-22 4 views
4

이 코드의 문제점과 해결 방법은 다음과 같습니다. g 변수가 만료되기 전에예외 : 액세스 위반

#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()는 호출 할 수 없습니다. VC++ 2012에서 컴파일되었으며 디버그 및 릴리스 모드에서 동일한 문제가 발생했습니다.

답변

5

당신의 guard참조을 유지하지만 그것은 걸립니다. 참조guard의 생성자가 끝나 자마자 무효화됩니다. 이는 make_guard에 전달 된 매개 변수가 아니라 생성자가 취한 last 매개 변수를 나타냅니다.

잘못된 참조에 액세스하면 의 정의되지 않은 동작이 발생하며 모든 베팅은 해제됩니다.

+0

감사합니다. 이미 고칠 수 있습니다. 하지만 변수'g'가 만료되지 않았을 때'first()'와'last()'가 직접 실패한 이유는 아직도 모르겠다. –

+1

@Mike : _undefined behavior_에서 발생하면 아무 일도 일어나지 않을 수 있습니다 ... –

+0

전역 함수의'first' 및'last' 주소가 아닌가요? 왜 그들은 무효가됩니까? – user93353

관련 문제