`

C++ 中的new,delete与构造函数,析构函数的调用时机

    博客分类:
  • C++
 
阅读更多
结论:new 一个数组时必须要有默认构造函数;
     delete数组时其中的所有元素的析构函数均会被调用。


#include <iostream>

using namespace std;
class TmpClass{
public:
	int member;
	TmpClass(int a):member(a){
		cout<<"构造函数:int"<<endl;
	}

	TmpClass():member(0){//没有默认构造函数时没法new一个该类的数组
		cout<<"构造函数:默认"<<endl;
	}

	TmpClass(TmpClass& tmp){
		cout<<"copy 构造函数"<<endl;
	}

	TmpClass& operator=(const TmpClass& tmp){
		if(this==&tmp){
			cout<<"= 自己"<<endl;
			return *this;
		}

		this->member=tmp.member+100;
		cout<<"= 非自己"<<endl;
		//没写return 也编译通过了
	}

	//返回值改为void, 则下面的 m=m; 没问题, 但m=m=m;就不行了
// 	void operator=(const TmpClass& tmp){
// 		if(this==&tmp){
// 			cout<<"= 自己了"<<endl;
// 			return ;
// 		}
// 
// 		this->member=tmp.member+100;
// 		cout<<"= 非自己"<<endl;
// 
// 	}

	~TmpClass()
	{
		cout<<"析构函数,member="<<member<<endl;
	}
};



void main(){
	cout<<"***\tbefore new"<<endl;
	TmpClass* tmp=new TmpClass[2];
	cout<<"***\tafter new"<<endl<<endl;
	tmp[0].member=10;
	tmp[1].member=11;

	TmpClass m(1);
	m=(m=m);
	cout<<"***\tbefore push"<<endl;
	tmp[0]=m;
	cout<<"***\tafter push"<<endl<<endl;

	cout<<"***\tbefore delete"<<endl;
	delete []tmp;
	cout<<"***\tafter delete"<<endl;
	cout<<"main函数返回前"<<endl;
}


运行结果:

  • 大小: 38.4 KB
分享到:
评论

相关推荐

    C++中的new/delete、构造/析构函数、dynamic_cast分析

    主要介绍了C++中的new/delete、构造/析构函数、dynamic_cast分析 本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    c++基础语法:构造函数与析构函数

    析构函数是隐式调用的,delete对象时候会自动调用完成对象的清理工作。 现在主要看看继承中的构造函数和析构函数的调用: 代码如下:class A {} ;class B : public A{};class C : public B{}; c * ptr = new...

    详解在C++中显式默认设置的函数和已删除的函数的方法

    在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数、复制构造函数、复制赋值运算符和析构函数。这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构。也...

    C++构造函数初始化顺序详解

    1.构造函数、析构函数与拷贝构造函数介绍 构造函数 1.构造函数不能有返回值 2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动...

    详解C++中如何将构造函数或析构函数的访问权限定为private

     当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致...

    C++new和delete详细解析

    C++中的new 和delete 是操作符,new 分配对象时候会自动调用构造函数,delete对象时候,会自动调用析构函数,而C语言中 malloc() 和 free() 是函数。 理论上malloc free 和 new 、delete 可以混搭用,但是好不要...

    C++中的三大函数和操作符重载(Boolan)

    如果对象是通过new操作符创建的,则通过delete操作符调用析构函数。 复制构造函数: 形如foo_t(const foo_t& foo),以下情况复制构造函数均会被调用: 当对象按值返回时候(returned by value) 调用按值传参的函数...

    Malloc和new区别

    之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的 任务强加于malloc /free. 3 ,因此C++ 语言需要一个能完成动态内存分配和初始化工作的...

    c++ 面试 2009

    delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,...

    后端,面试,c++ ,找工作

    (3)new可以调用对象的构造函数,对应的delete调用相应的析构函数。 (4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数 (5)new、delete返回的是某种数据类型指针,malloc、free返回的是void...

    C++中malloc与free、new与delete的详解与应用

    2.new申请的可以理解为对象,new时会调用构造函数,返回指向该对象的指针,delete时调用析构函数;malloc申请的只是内存,不是对象。 3.new/delete是保留字,不需要头文件支持;malloc/free需要头文件库函数支持。...

    C++编程思想习题

    14.9析构函数和虚拟析构函数 14.10小结 14.11练习 第15章 模板和包容器类 15.1包容器和循环子 15.2模板综述 15.2.1C方法 15.2.2Smalltalk方法 15.2.3模板方法 15.3模板的语法 15.3.1非内联函数定义 15.3.2栈模板...

    C++中避免内存泄露常见的解决方式

     在类的构造函数与析构函数中没有匹配地调用 new/delete!  解决方法:检查构造函数,在出现new的情况下,按相反的顺序在析构函数中匹配加入delete!  这里有两个意思:  1〉new与delete匹配,array new/...

    新手学习C++入门资料

    C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。...

    C++入门指南-v2.4.pdf

    3.4 C++类的构造函数与析构函数 39 3.5 对象数组 47 3.6 this指针 50 3.7 static静态成员变量 52 3.8 static静态成员函数 53 3.9 const成员变量和成员函数 55 3.10 const对象(常对象) 56 3.11 友元函数和友元类 58 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    15.4.4 虚析构函数 495 15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 ...

    零起点学通C++多媒体范例教学代码

    10.4.析构函数和delete运算符 10.4..1 默认析构函数 10.4.2 调用构造函数进行类型转换 10.5 浅层复制构造函数 10.6 深层复制构造函数 第11章 运算符重载 11.1 运算符重载 11.2 在成员函数中实现自加 11.3 重载前置...

    零起点学通C++学习_多媒体范例教学代码

    10.4.析构函数和delete运算符 10.4..1 默认析构函数 10.4.2 调用构造函数进行类型转换 10.5 浅层复制构造函数 10.6 深层复制构造函数 第11章 运算符重载 11.1 运算符重载 11.2 在成员函数中实现自加 11.3 ...

    Effective C++

    条款6:析构函数里对指针成员调用DELETE 条款7:预先准备好内存不够的情况 条款8:写OPERATOR NEW与OPERATOR DELETE要遵循常规 条款9:避免隐藏标准形式的NEW 条款10:如果写了OPERATOR NEW就要同时写OPERATOR DELETE ...

Global site tag (gtag.js) - Google Analytics