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에서 컴파일되었으며 디버그 및 릴리스 모드에서 동일한 문제가 발생했습니다.
감사합니다. 이미 고칠 수 있습니다. 하지만 변수'g'가 만료되지 않았을 때'first()'와'last()'가 직접 실패한 이유는 아직도 모르겠다. –
@Mike : _undefined behavior_에서 발생하면 아무 일도 일어나지 않을 수 있습니다 ... –
전역 함수의'first' 및'last' 주소가 아닌가요? 왜 그들은 무효가됩니까? – user93353