游戏开发之动态创建对象及构造函数、析构函数的执行(C++基础)

907 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

游戏开发之动态创建对象及构造函数、析构函数的执行(C++基础)

示例如下:

//成员初始化列表用来初始化类成员变量
	class A
	{
	public:
		A(int a)
		{
			std::cout << "初始化A" << std::endl;
		}

		~A()
		{
			std::cout << "析构A" << std::endl;
		}
	};


	class B
	{
	private:
		A _a1;
		A _a2;
		A _a3;
	public:
		B(): _a1(1), _a2(2), _a3(3)
		{
			std::cout << "初始化b" << std::endl;
		}

		~B()
		{
			std::cout << "析构B" << std::endl;
		}
	};

1.C++对象的创建

  • C++使用new创建对象时,会自动调用类的构造函数。
  • new的执行步骤:C++编译器先分配内存然后调用构造函数。

int main()
{
	B* p = new B();
	// delete p;
	return 0;
}

效果图

int main()
{
	B* p = new B();
	delete p;
	return 0;
}

效果图

TIPS:我们可以发现当我们未执行delete的时候,并未执行析构函数。只有当程序结束后,系统自动回收内存。而当我们执行delete的时候,执行析构函数。且先初始化成员变量,最后初始化类对象。同时回收内存的时候是按照栈区的结构,即栈的数据结构先进后出进行释放。

2.C++对象的释放

delete的执行步骤: 先调用析构函数然后释放内存。

class A
{
public:
	A(){std::cout << "构造函数" << std::endl;}
	~A(){std::cout << "析构函数" << std::endl;}
};
int main(int argc, char** argv)
{
	A* a = new A();
	delete a;
	a = nullptr;
	return 0;
}

3.数组的构造函数和析构函数

使用new创建数组时,必须使用delete删除数组的形式释放数组申请的内存空间。 new 数据类型[长度] ; delete[] 指针;

附上大多数编译器动态数组申请空间底层实现原理:单个对象则返回单个对象的首地址,而当创建多个对象时,该数组头部先是这个数组的长度,而后才是真正的对象实体。 效果图

  • 编译器不一定如此实现,但是很多编译器是这样做的。
  • 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。
  • 如果在new表达式中不使用[], 一定不要在相应的delete表达式中使用[].
int main()
{
	B *p1 = new B[6];
	delete[]p1;
	return 0;
}

效果图

4.delete void* 时,C++编译器可能会报错。

除非本身就是void*数据类型,否则不要尝试delete void*,因为不会调用析构函数。

例如:

int main()
{
	B *p1 = new B[6];
	delete[] (void*)p1;//错误!!
	return 0;
}

版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:(blog.csdn.net/qq135595696…)