本文已参与「新人创作礼」活动,一起开启掘金创作之路。
游戏开发之动态创建对象及构造函数、析构函数的执行(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…)