Destructors

来自cppreference.com
< cpp‎ | language

 
 
C++语言

|- class="t-nv-h1" | colspan="5" | 一般主题 |- | |- |

预处理器
注释

|

|-

|- class="t-nv-h1" | colspan="5" | 流程控制 |-

条件执行语句

| |- |

|

|-

循环语句

| |- |

|

|-

跳转语句

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 函数 |-

函数声明 Lambda函数声明 inline说明符 异常说明符 (已弃用) noexcept说明符 (C++11)

|- class="t-nv-h1" | colspan="5" | Exceptions |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 命名空间 |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类型 |- | |- |

|

|-

说明符

| |- |

decltype (C++11)
auto (C++11)
alignas (C++11)

|

|-

存储持续期说明符 Initialization

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 表达式 |- | |- |

值类别
求值顺序

|

|-

替代表示 字面量 布尔型 - 整型 - 浮点型 字符型 - 字符串 - nullptr (C++11) 用户定义 (C++11)

|- class="t-nv-h1" | colspan="5" | Utilities |-

属性 (C++11) Types typedef声明 类型别名声明 (C++11) Casts 隐式类型转换 - 显示类型转换 static_cast - dynamic_cast const_cast - reinterpret_cast 内存分配

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类 |- | |- |

|

|-

类特有的函数属性

| |- |

|

explicit (C++11)
static

|-

静态成员函数

| |- |

|

|- |- class="t-nv-h1" | colspan="5" | 模板 |- | |- |

|

|- |- class="t-nv-h1" | colspan="5" | 杂项 |- | |- |

|

|-

 
析构函数是一个特殊的成员函数,对象的生命周期结束时被调用。析构函数的目的是释放的对象在其一生中可能获得的资源.
原文:
A destructor is a special member function that is called when the lifetime of an object ends. The purpose of the destructor is to free the resources that the object may have acquired during its lifetime.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

目录

[编辑] 语法

~class_name (); (1)
virtual ~class_name (); (2)
~class_name () = default; (3) (since C++11)
~class_name () = delete; (4) (since C++11)

[编辑] 解释

#典型的析构函数声明
原文:
# Typical declaration of a destructor
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
#虚拟析构函数通常需要在基类中
原文:
# Virtual destructor is usually required in a base class
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
#强制编译器生成的析构函数
原文:
# Forcing a destructor to be generated by the compiler
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
#禁止隐式的析构函数
原文:
# Disabling the implicit destructor
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
析构函数时被调用对象的生命周期将结束,其中包括
原文:
The destructor is called whenever an object's lifetime ends, which includes
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
也可以被直接调用析构函数,例如销毁一个对象使用构造一个对象,通过分配器放置新的或通过一个分配器的成员函数,如std ::分配器的的destroy()方法,破坏。需要注意的是直​​接调用析构函数,对于一个普通的对象,如一个局部变量,调用未定义的行为时再次调用析构函数,在年底的范围.
原文:
The destructor may also be called directly, e.g. to destroy an object that was constructed using placement-new or through an allocator member function such as std ::分配器的的destroy()方法, to destroy an object that was constructed through the allocator. Note that calling a destructor directly for an ordinary object, such as a local variable, invokes undefined behavior when the destructor is called again, at the end of scope.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 隐式声明析构函数

如果没有用户定义的析构函数提供一类(structclass,或union),编译器将析构函数声明为inline public它的类成员.
原文:
If no user-defined destructor is provided for a class type (struct, class, or union), the compiler will always declare a destructor as an inline public member of its class.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 删除隐式声明的拷贝析构函数

隐式声明的或默认的析构函数的类T是不确定的(until C++11)/定义为“删除”(since C++11)以下是正确的:
原文:
The implicitly-declared or defaulted destructor for class T is undefined (until C++11) / defined as deleted (since C++11) if any of the following is true:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 平凡的析构函数

隐式声明的类的析构函数T以下是微不足道的,如果是真实的
原文:
The implicitly-declared destructor for class T is trivial if all of the following is true:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
一个平凡的析构函数析构函数不执行任何操作。平凡的析构函数的对象不需要delete表达式,并且可以设置通过简单的重新分配他们的存储。所有兼容的数据类型与C语言(POD类型)是平凡破坏的
原文:
A trivial destructor is a destructor that performs no action. Objects with trivial destructors don't require a delete-expression and may be disposed of by simply deallocating their storage. All data types compatible with the C language (POD types) are trivially destructible.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 隐式定义的析构函数

如果隐式声明的析构函数不会被删除或微不足道的,它的定义,函数体生成和编译的编译器。隐式定义析构函数有一个空的身体.
原文:
If the implicitly-declared destructor is not deleted or trivial, it is defined (that is, a function body is generated and compiled) by the compiler. This implicitly-defined destructor has an empty body.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 破坏序列

对于用户定义的或隐式定义的析构函数,析构函数体执行后,编译器调用析构函数的所有非静态的非变异类的成员,声明相反的顺序,然后它会调用所有施工相反的顺序(依次调用的析构函数的成员和他们的基地班等)的直接基类中的析构函数,然后,如果这个对象是最衍生类,它会调用析构函数的所有虚拟基础
原文:
For both user-defined or implicitly-defined destructors, after the body of the destructor is executed, the compiler calls the destructors for all non-static non-variant members of the class, in reverse order of declaration, then it calls the destructors of all direct base classes in reverse order of construction (which in turn call the destructors of their members and their base classes, etc), and then, if this object is of most-derived class, it calls the destructors of all virtual bases.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
即使直接调用析构函数(例如obj.~Foo();),在声明~Foo()没有控制权返回给调用者:它要求所有成员和基地的析构函数
原文:
Even when the destructor is called directly (e.g. obj.~Foo();), the return statement in ~Foo() does not return control to the caller immediately: it calls all those member and base destructors first.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 虚析构函数

删除对象通过基地的指针,调用未定义的行为,除非在基类的析构函数是虚拟的
原文:
Deleting an object through pointer to base invokes undefined behavior unless the destructor in the base class is virtual:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

class Base {
 public:
    virtual ~Base() {}
};
class Derived : public Base {};
Base* b = new Derived;
delete b; // safe

一个共同的原则是基类的析构函数必须是either public and virtual or protected and nonvirtual
原文:
A common guideline is that a destructor for a base class must be either public and virtual or protected and nonvirtual
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 纯虚析构函数

析构函数声明为纯虚,例如,在需要进行抽象的,而是有没有其他合适的功能,可以被声明为纯虚基类。这样的析构函数必须有一​​个定义,因为所有的基类的析构函数的派生类中被破坏时,总是叫。数目
原文:
A destructor may be declared pure virtual, for example in a base class which needs to be made abstract, but has no other suitable functions that could be declared pure virtual. Such destructor must have a definition, since all base class destructors are always called when the derived class is destroyed:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

class AbstractBase {
 public:
    virtual ~AbstractBase() = 0;
};
AbstractBase::~AbstractBase() {}
class Derived : public AbstractBase {};
// AbstractBase obj;   // compiler error
Derived obj;           // OK

[编辑] 示例

#include <iostream>
 
struct A
{
    int i;
 
    A ( int i ) : i ( i ) {}
 
    ~A()
    {
        std::cout << "~a" << i << std::endl;
    }
};
 
int main()
{
    A a1(1);
    A* p;
 
    { // nested scope
        A a2(2);
        p = new A(3);
    } // a2 out of scope
 
    delete p; // calls the destructor of a3
}

输出:

~a2
~a3
~a1
来自“http://zh.cppreference.com/mwiki/index.php?title=cpp/language/destructor&oldid=38202