草庐IT

c++ - 多态类中的虚析构函数

我知道只要你有一个多态基类,基类就应该定义一个虚析构函数。这样当一个指向派生类对象的基类指针被删除时,会先调用派生类的析构函数。如果我在这里错了,请纠正我。此外,如果基类析构函数是非虚拟的,则删除指向派生对象的基类指针将是未定义的行为。如果我也错了,请纠正我。所以我的问题是:为什么当基类析构函数是非虚函数时,对象不会被正确销毁?我假设这是因为虚函数有某种表格,每当调用虚函数时都会记住和查阅该表格。并且编译器知道当一个对象应该被删除时,它应该首先调用派生的析构函数。我的假设是否正确? 最佳答案 如果在删除对象时变量的静态类型是bas类

c++ - 在父类的析构函数中加入成员线程访问其父类的其他成员是否会导致未定义的行为?

我的一位同事声称,一旦对象的析构函数调用开始,线程(对象本身的成员)对对象成员的所有访问都是UB。这意味着如果线程正在访问对象的任何其他成员,则在对象的析构函数期间调用std::thread::join是UB。我在“对象生命周期”下简要查看了最新的标准草案,但找不到可以给我结论性答案的内容。是否执行以下代码(onwandbox)引入未定义的行为?阐明此交互的标准部分是什么?structA{atomicx{true};threadt;//Capturing'this'ispartoftheissue.//Theideaisthataccessing'this->x'becomesinva

c++ - 当它是 noop 时是否需要调用一个非平凡的析构函数?

当您知道在这种特定情况下析构函数是noop时,标准是否要求调用非平凡的析构函数?如果不调用析构函数,代码是否可能被编译器破坏?用例是一个包含动态分配指针的类。默认情况下,此指针由构造函数中的new获取。此类还可以从分配器获取其动态分配的指针。该类跟踪它如何获得其指针并在析构函数中调用delete如果指针是由new获得的,如果它是由分配器获得的则什么都不调用,因为分配器将释放内存。存储在动态内存中的数据只是普通类型,因此不需要调用它们的析构函数。所以问题是,如果我知道它是通过分配器获得它的指针的,那么我还需要调用类的析构函数吗?这是一个最小的简化示例,所有与问题不直接相关的内容都已删除。

c++ - 如何处理抛出异常的文件析构函数?

关闭正在写入的文件时检测错误很重要,因为数据的最后一部分可能会在关闭期间被刷新,如果它丢失,那么您最后一次写入实际上失败了,应该有人知道这件事.文件对象的析构函数是自动关闭它的好地方,但人们说不要从析构函数中抛出异常,所以如果关闭失败那么你怎么知道呢?我听说有人建议手动调用文件的close()方法。这听起来不错,除了如果多个文件的close()方法在这种情况下全部失败会发生什么:MyFilex(0),y(1),z(2);x.close();y.close();z.close();?好吧,如果“x”的close()方法抛出异常,那么您已经很好地维护了避免在“x”的析构函数中抛出异常的规则

c++ - 返回该对象(不是作为指针)时是否不打算调用析构函数?

我有一个函数:staticBwahboo(){Bwahbwah;returnbwah;}还有一个主要功能:intmain(){Bwahboo=Assigner::boo();coutBwah的析构函数仅在“到达此处”打印后调用一次。这是有保证的还是编译器优化? 最佳答案 这是一种称为返回值优化(RVO)的优化。这是一个常见的优化,但您不能依赖它。这里有两个非常好的链接,可以帮助您了解更多信息:首先,一篇关于passbyvalue,rvaluesemantics,thereturnvalueoptimization,andrvalue

c++ - 虚拟析构函数如何工作?

我正在使用gcc。当我们销毁由基类指针指向的派生类对象时,我知道虚拟析构函数如何解决问题。我想知道它们是如何工作的?classA{public:A(){cout当我把A的析构函数改成虚函数时,问题就解决了。为此的内在工作是什么。为什么我要使A的析构函数成为虚拟的。我想知道A和B的vtable发生了什么? 最佳答案 虚析构函数只是一个虚函数,所以它遵守相同的规则。当您调用deletea时,会隐式调用析构函数。如果析构函数不是虚拟的,您将被称为a->~A(),因为它像其他所有非虚拟函数一样被调用。但是,如果析构函数是虚拟的,您将按预期调

c++ - 为什么 this 指针地址与析构函数中的预期地址不同 (c++)

我对基类析构函数中的this指针有一个奇怪的问题。问题描述:我有3个类(class):A1、A2、A3A2公开继承自A1并私有(private)继承A3classA2:privateA3,publicA1{...}A3有一个函数getPrimaryInstance()...返回一个A1类型的引用到A2实例:A1&A3::getPrimaryInstance()const{staticA2primary;returnprimary;}A3构造函数如下所示:A3(){getPrimaryInstance().regInst(this);}(其中regInst(...)是A1中定义的函数,它

c++ - 析构函数调用(堆栈)变量之间的赋值?

matrixm1(5,5);matrixm2(5,5);m1=matrix(m2);对于上面的代码(对于任意类,矩阵),当m2的信息被复制到它时,是否会调用与m1相关的信息的析构函数? 最佳答案 不,赋值运算符需要处理释放m1在执行赋值之前可能持有的任何资源。只有当m1即将超出范围时才会调用析构函数。 关于c++-析构函数调用(堆栈)变量之间的赋值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q

c++ - 未定义对析构函数的引用

我已经用C++编写了一些代码,但是当我尝试编译时,出现了一个非常奇怪的错误,这是我不应该出现的。这是我的代码:#includeusingnamespacestd;#include"articles.h"intmain(){//CréationdesarticlesconstStylos1("s1","Stylojade","Watertruc",500,"Noir");constRametter1("r1","Ramettehautequalité","Clairefont",95,80);//Créationdeslots(10%deréduction)constLotl1("l1"

c++ - 具有已删除析构函数的类型的动态对象是如何构造的?

假设我有这样的东西:structfoo{~foo()=delete;}假设我稍后动态分配了一个类型为foo的对象:foo*f=newfoo;这很好;我假设合成的默认构造函数用于构造由f表示的对象,但是:foof2;给我一​​个错误:Attempttouseadeletedfunction那么如果foo的默认构造函数被隐式删除,那么f表示的对象是如何构造的呢?此外,假设foo有私有(private)成员size_tn。对于动态分配的foo,例如f表示的n的值是多少? 最佳答案 当你写作时foof;编译器需要能够在f最初创建时构造它。由