关于类对象的析构问题

我们按照正常的思路,来探讨一下这个问题。

首先是定义一个类,这里就不说明了。

然后是创建类的对象(实例化一个类),一般有两种方法:常规创建的方法和动态创建的方法。见代码事例:

// 定义类
class A
{
   public:
   ~A();
};
A::~A()
{
   cout<<"析构"<<endl;
}

void main()
{
   A a;  // 常规创建的方法
   A *p = new A; // 动态创建的方法
}

何时析构?

(1)常规创建的方法就像我们创建一个内部类型的变量一样。常规创建的对象像普通变量一样有它自己的作用域,当常规创建的对象超出作用域时,会自动运行该对象的析构函数。

(2)动态创建的对象,只有我们主观的去删除指向动态对象的指针时,才会运行该对象的析构函数。我们知道指针也是一个变量,它也有自己的作用域,当指向动态对象的指针超出自己的作用域时,动态对象是不会运行析构函数的,这也就造成了“内存泄漏”。

变量的作用域其实就是我们能在代码段里能够使用该变量的地方,当超出该变量的作用域,也就不能再使用该变量了。动态创建的对象的作用域,其实是委托给了指向该对象的指针,即该指针的作用域和动态对象的作用域是一体的,当指针丢失时,动态对象也就无法再使用了。这里可能不太好理解,我下面举一个例子。

定义类A和类B

// 定义类A
class A
{
   public:
   ~A();
};
A::~A()
{
   cout<<"析构A"<<endl;
}

// 定义类B
class B
{
   public:
   ~B();
};
B::~B()
{
   cout<<"析构B"<<endl;
}

主函数

// 主函数
void main()
{
   A* p = NULL;
   {
     p = new A;
     B a;
   }
}

时间: 2024-08-03 17:24:05

关于类对象的析构问题的相关文章

为什么c++基类不是虚析构函数,析构派生类对象也自动析构基类

问题描述 为什么c++基类不是虚析构函数,析构派生类对象也自动析构基类 测试环境:Win7 + VC++6.0 问题:如图,基类析构函数**不是**虚函数,但是析构派生类时,基类的析构函数也自动执行了,不是只有是虚析构函数才会自动析构基类么?? 解决方案 记得是虚的才是只执行子类不执行父类的吧. 解决方案二: 虚的才是只执行子类不执行父类 解决方案三: 虚基类的非虚基类优先于非虚基类的非虚基类 解决方案四: 子类析构,都会调用父类的.父类虚析构是为了多态的时候,能够正确调用子类的析构函数. 解决

如何让类对象只在栈(堆)上分配空间?

转自:http://blog.csdn.net/hxz_qlh/article/details/13135433 一般情况下,编写一个类,是可以在栈或者堆分配空间.但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类.这能不能实现呢?仔细想想,其实也是可以滴. 在C++中,类的对象建立分为两种,一种是静态建立,如A a:另一种是动态建立,如A* ptr=new A:这两种方式是有区别的. 1.静态建立类对象:是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后

对象的初始化-用函数的返回值初始化一个类对象,这其中用了几次复制构造函数

问题描述 用函数的返回值初始化一个类对象,这其中用了几次复制构造函数 这是我自己写的一段代码#includeusing namespace std;class Example{int num;public:Example(int i){num=i;cout<<""This is construction with parameter.n"";}Example(){num=0;cout<<""This is construc

C++类对象的拷贝构造函数分析

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CA{ public: CA(int b) { a=b; } void Show () { cout<<a<<endl; } private: int a;};int main(){

static-类的方法调用与类对象的方法调用的区别?

问题描述 类的方法调用与类对象的方法调用的区别? public class A { public static A a=new A(); public void text() {} } public class B { A.a.test(); A a1=new A(); a1.test() //这两种的调用方法的差别请问是什么啊? public static int c; public int c1; //就是一个用Static变量和没有用static声明一个变量的差别吗? //如果非得那么实现

ios-无法初始化类对象-XCode

问题描述 无法初始化类对象-XCode 执行文件如下: @implementation Utils +(id)alloc { return [self instance]; } +(Utils *)instance { static Utils *utils = nil; if (!utils) { utils = [self init]; } return utils; } -(Utils *)init { self = [super init]; if (self) { mConst = [

派生类与派生类对象对基类成员的访问

区分"派生类对象"和"派生类"对基类成员的访问权限.    "派生类对象"对基类成员的访问权限:      (1)对于公有继承,只有基类的公有成员可以被"派生类对象"访问,其他(保护和私有)成员不能被访问.      (2)对于私有继承和保护继承,基类中所有成员都不能被"派生类对象"访问.    "派生类"对基类中成员的访问权限:     (1)对于公有继承,基类中的公有成员和保护成

WINX窗口类对象的内存管理

为了引入WINX窗口类对象的内存管理(生命周期模型),我绕了一大圈子.实在是,内存 管理太重要了,花多少口舌介绍它都不过分.我曾经见到这样一句话:"C++程序员觉得 内存管理太重要了,所以一定要自己进行管理:Java/C#程序员觉得内存管理太重要了,所以 一定不能自己去管理".从某种意义上说,两者都是对的. 那么WINX的窗口对象是否也是采用gc allocator呢? 答:不是. 具体问题具体分析.在通常情况下,我个人确实已经非常习惯使用gc allocator来进行内 存管理,但是

C++类对象的深拷贝、浅拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: #include <iostream>using namespace std;class Test{public: Test(int temp) { p1=temp; }protected: int p1;};void main(){ Test a(9