Destructors

来自cppreference.com
< cpp‎ | language

 
 
C++语言
大会的主题
原文:
General topics
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
流量控制
原文:
Flow control
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
条件执行语句
原文:
Conditional execution statements
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
迭代语句
原文:
Iteration statements
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
跳转语句
原文:
Jump statements
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
功能
原文:
Functions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
函数声明
lambda函数的声明
函数模板
的历史。内嵌说明
异常规范 (已弃用)
noexcept说明 (C++11)
例外
原文:
Exceptions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
命名空间
原文:
Namespaces
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类型
原文:
Types
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
decltype specifier (C++11)
规范
原文:
Specifiers
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
CV符
存储时间说明符
constexpr说明 (C++11)
汽车符 (C++11)
alignas说明 (C++11)
初始化
原文:
Initialization
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
原文:
Literals
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
布尔文字
nullptr (C++11)
用户定义的 (C++11)
表达式
原文:
Expressions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
另一种表示形式
实用工具
原文:
Utilities
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类型
原文:
Types
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
typedef declaration
声明类型别名 (C++11)
属性 (C++11)
施放
原文:
Casts
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
隐式转换
const_cast conversion
static_cast conversion
dynamic_cast conversion
reinterpret_cast conversion
C-风格和功能转换
内存分配
原文:
Memory allocation
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
原文:
Classes
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类特定的功能特性
原文:
Class-specific function properties
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
虚函数
覆盖说明 (C++11)
最后说明 (C++11)
明确的 (C++11)
静态的
特殊的成员函数
原文:
Special member functions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
复制的任务
移动分配 (C++11)
析构函数
模板
原文:
Templates
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
类模板
函数模板
模板特化
参数包 (C++11)
杂项
原文:
Miscellaneous
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
内联汇编
 
析构函数是一个特殊的成员函数,对象的生命周期结束时被调用。析构函数的目的是释放的对象在其一生中可能获得的资源.
原文:
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) (C++11 起)
~class_name () = delete; (4) (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 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 程序终止时,具有静态存储持续时间的对象
    原文:
    program termination, for objects with static storage duration
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 线程退出时,线程局部存储时间(C++11 起)的对象
    原文:
    thread exit, for objects with thread-local storage duration (C++11 起)
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 结束的范围,对象具有自动存储时间和临时变量绑定到一个参考的寿命延长
    原文:
    end of scope, for objects with automatic storage duration and for temporaries whose life was extended by binding to a reference
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • delete表达式,动态存储持续时间的对象
    原文:
    delete-expression, for objects with dynamic storage duration
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 结束的充分体现,对于无名的临时对象
    原文:
    end of the full expression, for nameless temporaries
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 栈展开时,自动存储持续时间的对象的异常时,脱块,未捕获的.
    原文:
    stack unwinding, for objects with automatic storage duration when an exception escapes their block, uncaught.
    这段文字是通过 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是不确定的(至 C++11)/定义为“删除”(C++11 起)以下是正确的:
原文:
The implicitly-declared or defaulted destructor for class T is undefined (至 C++11) / defined as deleted (C++11 起) if any of the following is true:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • T有一个非静态数据成员不能被破坏(已删除或无法访问的析构函数)
    原文:
    T has a non-static data member that cannot be destructed (has deleted or inaccessible destructor)
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • T有直接或虚基类,它可以不被破坏(已删除或无法访问的析构函数)
    原文:
    T has direct or virtual base class that cannot be destructed (has deleted or inaccessible destructors)
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • T是工会,有一个变体成员与非平凡的析构函数(C++11 起)
    原文:
    T is a union and has a variant member with non-trivial destructor (C++11 起)
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 隐式声明的析构函数是虚拟的(因为基类有虚析构函数)和查找释放函数(operator delete()中调用暧昧的结果,删除,或无法访问的功能.
    原文:
    The implicitly-declared destructor is virtual (because the base class has a virtual destructor) and the lookup for the deallocation function (operator delete() results in a call to ambiguous, deleted, or inaccessible function.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 平凡的析构函数

隐式声明的类的析构函数T以下是微不足道的,如果是真实的
原文:
The implicitly-declared destructor for class T is trivial if all of the following is true:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 的析构函数不是虚拟的(也就是基类的析构函数不是虚拟的)
    原文:
    The destructor is not virtual (that is, the base class destructor is not virtual)
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 所有直接基类有虚析构函数
    原文:
    All direct base classes have virtual destructors
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 所有的非静态数据成员类类型(或类类型的数组)有虚析构函数
    原文:
    All non-static data members of class type (or array of class type) have virtual destructors
    这段文字是通过 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