【C++】C++创建对象及注意事项

    C++的对象创建方式有3种,详细见以下代码所示。

 

#include <iostream>

using namespace std;

Class Test
{
private:
	int m;
public:
	Test(int m)
	{
		cout << "Construct Object m" << endl;
	}
	~Test()
	{
		cout << "Destroy Object m" << endl;
	}
}

int main()
{
	Test a(1);				//栈中分配
	
	Test b = Test(1);		//栈中分配
	
	Test *c = new Test(1);	//堆中分配
	delete(c);
	c = NULL;
	
	return 0;
}


三种方式中,第一种和第二种分别为隐式调用和显示调用,两者都是在进程的虚拟地址空间的栈空间中分配内存。

 

第三种方式使用了关键字new,是在堆空间中分配内存。

 

注意: 栈空间中的内存分配和释放是由系统管理,而堆空间中的内存分配和释放是由程序自主释放,因此堆空间的对象的new和delete需要配对使用,否则会导致内存泄露问题。因此,在使用new创建对象时有以下几点注意事项:

1. new创建类对象需要指针接收,一处初始化,多处使用;

2. new创建类对象生命期结束后需显示使用delete销毁;

3. new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间;

4. new对象指针用途广泛,比如作为函数返回值、函数参数等;

5. new / delete需要申请内存空间,因此频繁调用对象的场合不适合使用new创建对象;

6. 栈空间大小远小于堆空间大小;

7. 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

 

附加:

使用栈空间初始化对象失败时,不可用try...catch...捕获内存分配异常,而堆空间实例化出的对象可以使用try...catch...捕获内存分配异常。

 

try
{
	Test *pObj = new Test(1);
	Test& Obj = *pObj;

	delete(pObj);
	pObj = NULL;
}
catch(const std::exception &e)
{
	return -1;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值