草庐IT

Destructor

全部标签

c++ - 保存对象的析构函数地址并在以后调用它是否定义明确的行为?

我目前正在研究用C++编写的堆栈分配器。应该可以通过模板方法从此堆栈分配器获取对象。一旦调用另一个释放方法,这些对象就应该被销毁。在尝试使用不同的方法来实现析构函数的调用时,我偶然发现了以下内容:autodestructor=someObject->~SomeClass;destructor();析构函数似乎是被实际调用的,但这对我来说有点奇怪。我有以下问题:这是明确定义的行为吗?析构函数的类型是什么(我可以用什么替换auto关键字)?我能否将多个不同类型对象的所有析构函数地址保存在一个列表中,并在以后调用它们? 最佳答案 如评论所

c++ - 无法访问单例类析构函数中的私有(private)成员

我正在尝试实现这个单例类。但是我遇到了这个错误:'Singleton::~Singleton':无法访问类'Singleton'中声明的私有(private)成员这在头文件中被标记,最后一行包含右大括号。谁能帮我解释一下是什么导致了这个问题?下面是我的源代码。单例.h:classSingleton{public:staticSingleton*Instance(){if(!pInstance){if(destroyed){//throwexception}else{Create();}}returnpInstance;}private:staticvoidCreate(){static

c++ - Destructor间接调用虚函数

让我声明一下:我对Constructor或Destructor中的虚函数调用有清楚的理解。在下面的代码中,我试图避免仅出于实验目的的虚拟析构函数。现在我的问题是:在main中,对Destroyfun的调用调用了正确的虚函数。我期望对DestroyFunction的任何调用都应该调用正确的虚拟函数。但是放置在Base析构函数调用的Base虚函数中的同一个Destroy函数。这与静态绑定(bind)或编译器优化有关吗?classBase{public:Base(){}voidDestroy(){callVirtual();}virtualvoidcallVirtual(){cout.cla

c++ - 如何获取析构函数的成员函数指针?

假设我有structX{~X(){}};C++03中X::~X()的成员函数指针是什么类型,如何获取?我不想实际调用它,只是在SFINAE中使用它来确定是否存在给定类型的析构函数。 最佳答案 您无法获取析构函数或构造函数的函数指针。尽管如此,一个类型总是存在析构函数,并且您无法检测SFINAE是否不考虑它的带有as访问说明符的private。关于调用什么是标量类型的析构函数,标准说[class.dtor]/16:[Note:thenotationforexplicitcallofadestructorcanbeusedforanys

c++ - 为类存储指向另一个类的指针复制构造函数析构函数和赋值运算符

我是新来的,这是我的第一个问题。我对我的家庭作业有疑问。我被要求设计一个抽象类“Base”,它由类“Sub”继承(在作业中有sub1、sub2等,但我试图尽可能地缩小它的范围)。然后,我应该设计一个类“BasePtr”,它存储一个指向“Base”对象的指针。最后,baseptr:s将存储在std::vector中,并使用ostream_iterator和复制写入文件。然后应使用ifstream_iterator读取该文件,并将其存储在std::list中。我已经解决了上述问题,但在实现析构函数、复制构造函数和赋值运算符时遇到了一些问题(因为我在我的BasePtr类中动态分配内存,我相信

c++ - 构造函数中抛出的异常 : is the destructor called?

这个问题在这里已经有了答案:Whatdestructorsarerunwhentheconstructorthrowsanexception?(3个答案)关闭8年前。如果在对象的构造函数中抛出异常,那么是否会调用析构函数?还是未定义的行为?(这就是为什么我不愿意说出我的编译器做了什么。)structfoo(){foo(){throw"bar";}~foo(){/*amIcalled*/}};foof;

C++:未使用嵌入式模板调用析构函数

简而言之:删除模板化指针不会调用析构函数。include解决了这个问题。为什么?我刚刚遇到了一个我无法解释的情况。我尝试在此处分解更复杂的情况。文件R.cppclassR{Ownerm_o;voidcleanUp(){m_o.clear();}}文件所有者.cppstructDeleteFunctor{templatevoidoperator()(TPtr*ptr){deleteptr;}};templateclassOwner{std::vectorm_objects;//hereaddandotherstuffvoidclear(){std::for_each(m_objects.

c++ - C++ 中的虚拟析构函数与普通方法

考虑以下三个C++程序:节目1structbase{virtual~base()=0;};structderived:publicbase{~derived();};derived::~derived(){}intmain(){}节目2structbase{virtual~base()=0;};structderived:publicbase{~derived(){}};intmain(){}节目3structbase{virtualvoidfunc()=0;};structderived:publicbase{voidfunc();};voidderived::func(){}int

c++ - 是否使用非虚析构函数和基类指针释放了整个对象?

如果一个基类没有虚析构函数(例如为了避免vtable条目)并且派生类只有基本属性,它是否释放了new分配的所有内存,当基类的指针被删除?我知道Derived类的析构函数不会被调用,但我想知道整个对象分配的内存是否会被释放?我还假设在Derived指针上调用delete将释放整个内存空间。此外,如果它不释放内存的派生类部分,它如何在相同的情况下工作,但使用基类中的虚拟析构函数,知道要释放多少内存?例子:classBase{public:inta;intb;Base(){}~Base(){}};classDerived:publicBase{public:intc;intd;Derived

C++ 对析构函数的 undefined reference

对此很抱歉,但我正在重新打开它。在对本征错误进行排序后,这又重新出现了。完全相同的代码完全相同的错误。(好吧,这次编译器找到了特征header。)所以,同样的问题:我已经搜索了destructorc++和undefinedreference无济于事。不过,我很确定这是我的一个相当简单的失误。错误:/tmp/ccDsaJ9v.o:Infunction`main':geomSetup.cpp:(.text+0x5ab):undefinedreferenceto`SASAGeometry::~SASAGeometry()'geomSetup.cpp:(.text+0x5cd):undefin