时间:2021-05-20
自动析构时是先析构后构造的.
//普通(非模板)类的成员模板class DebugDelete{public: DebugDelete(ostream &s = cerr) :os(s){} template <typename T>void operator()(T*p)const { os << "deleting unique_ptr " <<typeid(T).name() <<endl; delete p; }private: ostream &os;};void demo_general_class_tempalte_member(){ double *p = new double; DebugDelete d; d(p);//d调用DebugDelet::operator()(double*),释放p int* ip = new int; //在一个临时DebugDelete 对象上调用operator()(int*) DebugDelete()(ip); //实例化DebugDelete::opeartor()<int>(int*)const unique_ptr<int, DebugDelete>p2(new int, DebugDelete()); //实例化DebugDelete::opeartor()<string>(string*)const unique_ptr<string, DebugDelete>sp(new string, DebugDelete());}这里输出
deleting unique_ptr double
deleting unique_ptr int
deleting unique_ptr class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
deleting unique_ptr int
可以看到,主动析构的正常进行.
函数结束后自动析构的,先创建了int后创建了string,但是先析构了string
class B{public: virtual ~B(){ cout << "delete B" << endl; }};class D :B{public: virtual ~D() override{ cout << "delete D" << endl; }};void demo_delete(){ D d;}输出
delete D
delete B
这里构造时是先构造基类,再构造派生类.但是在析构时是先析构了子类,再析构了基类。
知识点补充:C++ 构造与析构的执行顺序
1、代码如下:
2、执行顺序
A[0]
B
A[0]
~B
~A[17]
~A[0]
3、B是栈上对象,C++保证栈上对象离开作用域,会自动调用析构方法。
4、考虑b中的对象,_A是栈上对象,_PA是指针,堆上对象,对于_PA必须delete,否则资源泄露。而对于_A不需要处理,会自动调用析构方法。可以这样理解,对象b离开作用域,调用析构方法,而b中的_A当然也离开了作用域(皮之不存毛将存焉),调用析构方法。
5、碰到过这样的情况,vs自动生成的析构方法有问题,导致崩溃。手动添加一个析构方法,就可以了。
总结
到此这篇关于C++自动析构时的顺序的文章就介绍到这了,更多相关C++自动析构时的顺序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源;而具名对象则是与创建的顺序相反,依次调用析构函数。c++源码:复制代码代码如下:classX{
1析构函数中是否可以抛出异常首先我们看一个常见的问题,析构函数中是否可以抛出异常。答案是C++标准指明析构函数不能、也不应该抛出异常!C++异常处理模型是为C+
首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函
C++中的虚析构函数到底什么时候有用的,什么作用呢。一.虚析构函数的作用总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也
C++析构函数创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作(例如回收创建对象时消耗的各种资源),这个函