这个代码有什么问题以及如何修复它.
#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();
}
Run Code Online (Sandbox Code Playgroud)
该函数first()和last()变量之前不能被称为g过期.在VC++ 2012上编译,在调试和发布模式下都遇到了同样的问题.
你guard保留一个参考,但它需要一个值.该参考尽快变为无效guard的构造函数结束,因为它是指last由构造函数,而不是传递给参数拍摄参数make_guard.
一旦您访问了无效的引用,您就会有未定义的行为,并且所有的赌注都已关闭.
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |