Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的析构函数+;_C++_Destructor - Fatal编程技术网

C++ C+中的析构函数+;

C++ C+中的析构函数+;,c++,destructor,C++,Destructor,析构函数是释放分配给它所属的对象的内存,还是只是调用它,以便在编译器释放对象之前,它可以在最后一分钟执行一些内务管理?调用析构函数是为了允许对象执行清理,以及销毁对象本身拥有的任何其他对象创造 在完成析构函数后,操作系统将处理对象本身的解除分配。编译器不会删除任何内容。它创建在运行时执行操作的代码 当你写时,删除一些指针编译器本质上写: if ( has_virtual_destructor( * somePointer ) ) { // virtual dispatch t

析构函数是释放分配给它所属的对象的内存,还是只是调用它,以便在编译器释放对象之前,它可以在最后一分钟执行一些内务管理?

调用析构函数是为了允许对象执行清理,以及销毁对象本身拥有的任何其他对象创造


在完成析构函数后,操作系统将处理对象本身的解除分配。

编译器不会删除任何内容。它创建在运行时执行操作的代码

当你写
时,删除一些指针编译器本质上写:

  if ( has_virtual_destructor( * somePointer  ) ) {
       // virtual dispatch to a compiler-generated function
      dynamic_cast< true_dynamic_type * >(somePointer)->destroy_dynamic_type();
       /* contents of true_dynamic_type::destroy_dynamic_type() {
              this->~true_dynamic_type();
              operator delete( this); // executed within class context
       } */
  } else {
      somePointer->~ClassName();
      operator delete(somePointer);
  }
if(具有虚拟析构函数(*somePointer)){
//虚拟分派到编译器生成的函数
dynamic_cast(somePointer)->destroy_dynamic_type();
/*true\u dynamic\u type的内容::destroy\u dynamic\u type(){
此->~true_dynamic_type();
运算符delete(this);//在类上下文中执行
} */
}否则{
somePointer->~ClassName();
运算符删除(somePointer);
}
换句话说,调用析构函数,然后调用运算符delete释放存储

如果析构函数是虚拟的,则使用虚拟分派以最派生的形式对对象执行整个操作。实现这一点的常用方法是向每个虚拟析构函数添加隐藏参数

请注意,顶级if语句实际上不是生成代码的一部分;编译器在编译时做出决定。

1)析构函数不属于对象,它属于类

2) 它为其类中的所有用户定义类型(类对象)调用析构函数


3) 清理是可选的活动,仅当确实需要时才执行该活动

在析构函数退出后,在执行返回到“delete”调用或对象实例超出范围的点之前,释放内存。理论上,可以设置一个不同的内存管理器来处理新的和删除,但是这将是默认行为的一个明确的改变。

< P>更具体地说,除了程序员之外,没有人在C++中分配内存。如果对象位于堆栈上,则它驻留在程序的内存空间中,并在程序的生存期内占用空间。如果该对象在堆上,则创建该对象的人负责取消分配该对象。这就是
delete
所做的。这就引出了析构函数——如果您在类中创建对象,析构函数允许您在类离开作用域时删除它们。它允许您“离开时关灯”。

析构函数自动调用被销毁对象的成员变量上的析构函数。这些析构函数可能会释放内存,也可能不会释放内存。但是,指针没有析构函数,或者如果您愿意,指针的析构函数什么也不做。它不会释放指向的内存。如果一个对象包含一个指向从“new”或“malloc”获取的对象的指针,则该对象的程序员需要让析构函数做正确的事情。如果从概念上讲,析构函数是被析构函数对象的一部分,则应将其编程为“删除”或“释放”内存。例如,“vector”对象通常从堆中获取内存,因为在编译时通常不知道所需的内存量。该内存在概念上是vector对象的一部分,因此vector类的程序员必须在析构函数中对其调用“delete”。标准模板库类(如std::vector)可以正确地执行此操作

另一方面,某些对象包含对其他对象的引用。字典或索引将包含指向概念上不属于它们的对象的引用(指针)。析构函数不能释放该内存。(如果从通讯录中删除电话号码,则不希望手机自动消失。)


有些例外情况,新手一开始不必担心。一种是当对象及其容器被编程为使用引用计数时,被引用的对象直到引用它的最后一个对象释放才真正被释放。另一个例外是“placement new”(放置新)的情况。

析构函数应该删除析构函数的对象所持有的任何动态分配的对象,但析构函数不负责释放其对象所在的内存。没有“编程器”。如果我是一名程序员,则使用std::vector类型的成员变量编写一个类,我不需要,也不能写代码来删除它。编译器将自动生成代码来调用std::vector析构函数,该函数是其他程序员在某个时间编写的,并在头文件中提供。始终存在一个“程序员”,即使它不是专门针对您的——计算机不会杀人,人会杀人。或者泄漏内存,随便什么。如果创建std::vector的成员变量,则该变量位于堆栈上。没有分配,就没有责任。如果您的std::vector在内部分配堆内存,那么在这种情况下,“程序员”是std::vector的程序员,而不是您,因此您不必担心它;v) …在虚拟析构函数的情况下,可能会提到强制转换为true dynamic类型。(而且,
operator delete
lookup的工作方式是,
delete
实际上是从一个“负责”的虚拟析构函数中调用的。不提及这一点可能会混淆配置文件跟踪。)@potatoswatter:feel-feee-to-edit。我无法解释滑坡,我只是输入了明显的错误。一个小错误是:如果(has_virtual_destructor…
在运行时没有执行。编译器可以决定每种类型(因此只取决于静态类型)它是否具有虚拟析构函数或非虚拟析构函数,并针对这两种情况发出相应的代码。不确定当您尝试
删除
a
无效时会发生什么