草庐IT

Destructor

全部标签

c++ - 在 C++ 中,静态对象可以比其静态成员变量长寿吗?

关于C++中静态变量的销毁顺序,静态对象的静态成员变量的生命周期是否有任何保证?例如,如果我有这样的东西(仅用于演示目的的疯狂简化示例):classObject{staticstd::vectorall_objects;publicObject(){all_objects.push_back(this);}~Object(){all_objects.erase(std::remove(all_objects.begin(),all_objects.end(),this),all_objects.end());}};对于不同编译单元中的静态对象,这是否“安全”?也就是说,是否可以保证al

c++ - 在 C++98 中,如何在不展开的情况下退出进程?

在C++11或更高版本中,我们可以调用std::quick_exit来退出进程而不进行任何展开,也就是说,不会调用析构函数[after|在]std::quick_exit.我有一个项目:它有一个全局对象,并且在全局对象的析构函数中存在fatalerror;我无权访问全局对象的源;如果我可以在main函数的最后一行调用std::quick_exit,则不会触发错误;出于某种原因,该项目必须使用C++98编译器进行编译;也就是说,我不能在C++98编译器中调用std::quick_exit。简而言之:C++98中的哪个函数等同于C++11的std::quick_exit?在Windows下

C++ 销毁顺序 : Calling a field destructor before the class destructor

有没有办法在类析构函数之前调用字段析构函数?假设我有2个类Small和Big,Big包含一个Small的实例作为它的字段因此:classSmall{public:~Small(){std::cout当然,这会在小析构函数之前调用大析构函数:BigdestructorSmalldestructor我需要在Big析构函数之前调用Small析构函数,因为它会为Big析构函数执行一些必要的清理工作。我可以:显式调用small.~Small()析构函数。->但是,这会调用Small析构函数两次:一次显式调用,一次在Big析构函数执行后调用。有一个Small*作为字段并在Big析构函数中调用del

c++ - 如果析构函数有副作用并且对象是从另一个静态对象的析构函数访问的,如何进行静态反初始化?

有一个简单而众所周知的模式可以避免静态初始化失败,在section10.13oftheC++FAQLite中有所描述。.在这个标准模式中,有一个权衡,要么构造的对象永远不会被破坏(如果析构函数没有重要的副作用,这不是问题),要么不能从另一个安全地访问静态对象静态对象的析构函数(参见section10.14oftheC++FAQLite)。所以我的问题是:如果静态对象的析构函数具有最终必须发生的重要副作用并且静态对象必须由另一个静态对象的析构函数访问,您如何避免静态反初始化失败?(注意:FAQ-lite提到这个问题在M.Cline和G.Lomow的C++FAQs:FrequentlyAs

c++ - 具有指针结构的类是否需要析构函数

我有一个类,它有一个结构,其中一个成员是指针。structgroup{void*v1,void*v2;};classA{A(group&handle):m_handle(handle)private:groupm_handle;};类A中没有指针成员。当A中没有定义析构函数时,我没有看到任何问题(例如内存泄漏)。我了解到,当对象A超出范围时,会调用A的析构函数如果A中存在成员类,则调用它们的析构函数,依此类推。那么,像上面的m_handle这样的成员结构会发生什么-它们是否具有类似于析构函数的任何东西,以及当对象A超出范围时如何删除结构组中的两个空指针? 最

c++ - vector::clear() 幕后和破坏

我研究过STLvector的实现。vector容器被实现为一个动态数组。方法clear()用于破坏vector中的所有元素,它将vector的大小设置为0,但容量保持不变。所以,如果我理解正确的话,所有的元素都被称为它们的析构函数,但是动态分配的内存仍然可用。为了仍然释放它,我们可以这样做:Vec.swap(vector());//Capacity=0.但是假设我们没有使用swap,只是做了一个clear。内部实现(如果我错了请纠正我)大约等于以下内容(以非常简化的方式)://Acontainedtype:structC{intm;C():m(123){}};C*arr=newC[10

c++ - 为什么在全局变量的析构函数中调用 thread.join 会失败

我将有问题的代码简化为以下内容。我有一个C类,它在自己的线程上运行一个成员函数。在C的析构函数中,我想干净地退出这个线程。只要c是在main(1)中定义的,它就可以正常工作,但当它是一个全局变量(2)时就不行了。在后一种情况下,我看到线程函数返回但t.join()挂起。#include#include#include#includeusingnamespacestd;classC{public:C(){stop=false;t=thread(&C::ThreadFunc,this);}~C(){stop=true;cv.notify_all();if(t.joinable()){cou

C++ : noexcept (or throw()) virtual destructor = default;

下面的代码是合法的吗?classC{virtual~C()noexcept=default;};或classC{virtual~C()throw()=default;};(throw()已弃用,但我的编译器不支持noexcept;;) 最佳答案 8.4.2[dcl.fct.def.default]Anexplicitly-defaultedfunction[...]mayhaveanexplicitexception-specificationonlyifitiscompatible(15.4)withtheexception-spe

c++ - 编译器破坏优化对象(从未创建)

我简化了我的代码以找到问题的根源://==============================================================================//PRE-DEFINITIONS#defineGIVE_ME_ODD_BEHAVIOURtrue//==============================================================================//INCLUDES#include//==================================================

c++ - 析构函数无法删除已分配的连续内存块

以下代码可以编译但在运行时会出现错误:#include#includeclassA{public:A(){}A(intid,char*t_name){_id=id;name=newchar[strlen(t_name)+1];strcpy(name,t_name);}char*name;int_id;~A(){delete[]name;}};intmain(){Aa(1,"123");Ab;b=a;std::cout(a.name)(b.name)(a.name)(b.name)它的输出是这样的:0x7ff87bc032000x7ff87bc032000x7ff87bc032000x1