相关疑难解决方法(0)

为什么在从win32计时器回调中抛出时我的析构函数不被调用?

我刚问了这个问题.简而言之,当你从win32计时器回调中抛出时,异常似乎无处可去.它似乎是由Windows在某处偷偷摸摸地处理的.

好吧,这是一个问题.问题的另一方面是抛出此异常时似乎没有调用析构函数.在下面的代码中,对于std::vectorCFoo,输出"~CFoo"的唯一时间是当GetFooVect中的临时值被破坏以及rValue被复制到fooVect时.fooVect的内容不会被破坏.

这是我最糟糕的噩梦.我非常重视使用RAII.我非常依赖我的析构函数进行适当的清理.

class CFoo
{
public:
    ~CFoo() {printf(__FUNCTION__ "\n");}
};

std::vector< CFoo > GetFooVect()
{
    std::vector< CFoo > rValue;
    rValue.push_back(CFoo());
    rValue.push_back(CFoo());
    rValue.push_back(CFoo());
    return rValue;
}

VOID CALLBACK Timer(HWND hwnd,
    UINT uMsg,
    UINT_PTR idEvent,
    DWORD dwTime)
{
    // My destructors aren't called?
    std::vector< CFoo> fooVect = GetFooVect();

    // I'm destroyed
    CFoo aFoo;

    throw FooExcept();
    printf("Also Here\n");
}
Run Code Online (Sandbox Code Playgroud)

我尝试通过简单地抛出/捕获C++异常(即删除win32计时器回调变量)来重新创建这个,并且CFoo的向量可以很好地破坏.出于某种原因,析构函数不会在这里被称为向量中的东西.是什么赋予了?对此有合理的解释,还是只是奇怪,或两者兼而有之?

c++ winapi exception

1
推荐指数
1
解决办法
252
查看次数

标签 统计

c++ ×1

exception ×1

winapi ×1