一例析构顺序造成的错误

原创 2006年05月24日 09:48:00
类中成员变量定义的顺序会有什么影响?
应该是没有,平时谁会去注意下面代码中m_xxx, m_yyy的先后次序呢?

class CXxx;
class CYyy;

class CZzz;
{
    ...
private:
    CXxx m_xxx;
    CYyy m_yyy;
}

其实是有区别的,就是定义顺序造成析构顺序不同。

本例就是实际DEBUG过程中发现的析构顺序造成的错误。(VC环境)

代码中m_yyy的析构早于m_xxx(与构造顺序相反),
若m_xxx保存了m_yyy的一个指针m_pY, 并在析构过程中引用该指针就会有意外。

CXxxx::~CXxxx()
{
    m_pY->MethodOfYyy();
}

m_pY所指向的对象已经析构,虽然调用一般不会报错,但结果错误的。
m_yyy析构以后的简单成员变量会保持原值,但如std::string这样的复杂变量已清空。

解决方法:
改变定义顺序虽可消除错误,其实应该改变流程,使析构顺序与行为无关。
如不要在析构方法中引用可能已无效的指针,可改为显示调用。

Debug心得:
实际代码远非如此简单,指针的传递层次较多。现象为一个string无故变空。
不知道如何设置断点,所有赋值语句都禁掉还是自动变化。
VC的数据断点也不灵。
在错误无法定位时,首先要设法使错误容易复现。
通过缩小测试数据的规模,只保留使错误重现的最小数据集,然后再跟踪调试。
测试数据缩小后,仅跟踪执行了几次就发现变量改变的点在析构函数上。

C++-自动析构时的顺序

C++:自动析构时的顺序标签(空格分隔): Cpp自动析构时是先析构后构造的. //普通(非模板)类的成员模板 class DebugDelete{ public: DebugDelete(o...
  • qq_29596177
  • qq_29596177
  • 2017年03月15日 12:08
  • 446

c++对象成员变量的构造和析构顺序

// HelloWorld.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; class demo...
  • greyfreedom
  • greyfreedom
  • 2013年03月06日 22:07
  • 3479

包含对象成员的类的构造与析构顺序

构造函数的执行顺序: (1)存在继承关系时,先执行父类的构造函数,再执行子类的构造函数; (2)当一个类中含有对象成员时,在启动本类的构造函数之前,先分配对象空间,按对象成员的声明顺序执行他们各自的构...
  • pfd001
  • pfd001
  • 2016年03月25日 04:00
  • 994

C++全局变量与静态变量构造析构顺序问题

今天看到C++全局变量和静态局部变量的构造析构顺序的一道题,自己不会,于是就做了个实验,记录下来。实验代码如下: #include class A { int aaa; public: ...
  • qiu824039983
  • qiu824039983
  • 2016年08月25日 16:16
  • 1788

对象析构与线程安全

对象析构与线程安全 本文从C++程序设计的角度分析对象在析构的时候存在的线程安全问题,并以观察者模式的实现为例,提出了不同的解决办法。 线程安全问题的暴露 如果将一个对象的指针注册到另一个对...
  • juniway
  • juniway
  • 2016年01月02日 16:40
  • 483

拷贝构造函数与析构顺序

调用复制构造函数的时机: 1,用一个已有对象初始化另一个对象  void main() { Test88 t1; Test88 t3; //第一种场景 //1赋值构造函数和=操作是两个不...
  • u013797038
  • u013797038
  • 2016年02月21日 18:53
  • 341

C++中成员变量 父类 子类构造析构顺序

c++中对象都是先构造成员变量,再调用自身的构造函数;故父类成员变量首先被构造,然后调用父类的构造函数,再构造子类的成员变量,最后调用子类的构造函数。 对象析构时与构造顺序相反,子类先调用自身的析构...
  • bama2488313716
  • bama2488313716
  • 2015年03月25日 18:46
  • 2230

C++类成员构造函数和析构函数顺序示例详细讲解

这篇文章主要介绍了C++类成员构造和析构顺序示例,看了这个例子大家就可以明白c++构造析构的奥秘 对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象...
  • BickisyBinks
  • BickisyBinks
  • 2015年03月22日 09:58
  • 1804

全局对象和全局静态、局部静态析构顺序

多久不用C++ ,好多東西都模糊了,最近跟人討論全局和靜態的析構順序,之前總覺得這個根據編譯器來決定的,其實還是有一定的說法的。 記錄一下:1. 全局与静态对象析构的顺序class A destru...
  • cartzhang
  • cartzhang
  • 2017年06月07日 21:49
  • 948

C++ 虚基类的析构函数的执行顺序

(1)执行派生类的析构函数 (2)调用对象成员(子对象)的析构函数,按类声明中对象成员           出现的逆序调用,而不是初始化列表中的次序。 (3)调用普通基类的析构函数,多个基类则按...
  • Slience_Perseverance
  • Slience_Perseverance
  • 2014年03月04日 10:14
  • 1135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一例析构顺序造成的错误
举报原因:
原因补充:

(最多只允许输入30个字)