首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAII资源处理

RAII资源处理
EN

Stack Overflow用户
提问于 2013-01-09 02:22:19
回答 1查看 456关注 0票数 7

我有一个RAII课程:

代码语言:javascript
复制
 template<typename T>
    class RAII
    {
    public:
    explicit RAII( T* p = 0 ): p_(p){}

    ~RAII() {delete p_;}

    T& operator*() const { return p_;} 
    T* operator‐>() const{ return p_;}
    };

代码语言:javascript
复制
{

RAII<std::vector<int>> r(new std::vector<int>());
std::cout<<r­‐>size()<<std::endl;

} // The std::vector<int> is automatically deallocated

我知道当我超出范围时我的析构函数就会被调用。~RAII() {delete P_};

我的问题是:

它怎么叫我的破坏者?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 06:29:06

当抛出异常并将控件从try块传递到处理程序时,C++运行时将调用自try块开始以来构造的所有自动对象的析构函数。此过程称为堆栈展开。自动物体按其结构的相反顺序被销毁。(自动对象是已声明为自动或注册、或未声明为静态或外部的本地对象。每当程序退出声明x的块时,自动对象x就会被删除。)

如果在构造由子对象或数组元素组成的对象时抛出异常,则只对抛出异常之前成功构造的次对象或数组元素调用析构函数。只有在成功构造对象时,才会调用本地静态对象的析构函数。

如果在堆栈解除过程中,析构函数抛出一个异常,而该异常未被处理,则调用终止()函数。

示例:参见下面的反汇编。您将看到析构函数已经被推到堆栈上。

代码语言:javascript
复制
class Test
{
public:
    Test()

    {
        std::cout<<"C'tor\n";
    }
    ~Test()
    {
        std::cout<<"D'tor\n";
    }
}
 int main()//_TCHAR* argv[])
{
Test();
}
00DD9C30 55                   push        ebp  
00DD9C31 8B EC                mov         ebp,esp  
00DD9C33 81 EC CC 00 00 00    sub         esp,0CCh  
00DD9C39 53                   push        ebx  
00DD9C3A 56                   push        esi  
00DD9C3B 57                   push        edi  
00DD9C3C 8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]  
00DD9C42 B9 33 00 00 00       mov         ecx,33h  
00DD9C47 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
00DD9C4C F3 AB                rep stos    dword ptr es:[edi]  
    23: 
    24:     Test();
00DD9C4E 8D 8D 3B FF FF FF    lea         ecx,[ebp-0C5h]  
00DD9C54 E8 67 7C FF FF       call        Test::Test (0DD18C0h)  
00DD9C59 8D 8D 3B FF FF FF    lea         ecx,[ebp-0C5h]  
00DD9C5F E8 03 76 FF FF       call        Test::~Test (0DD1267h)
    25: }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14227354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档