C++中的内存管理——关于new和delete的讨论

本文探讨了auto_ptr智能指针的基本用法及其在C++中的角色,包括初始化、所有权转移、释放等,并介绍了定位new表达式的应用场景及类内new/delete操作符的重载方式。
 1、关于new和delete使用的一般性规则略。

2、auto_ptr(<memory>) 类对象被初始化为指向由new表达式创建的动态分配对象,当auto_ptr对象的生命期结束时,动态分配的对象自动释放。auto_ptr类模版背后的 主要动机是支持与普通指针类型相同的语法,但是为auto_ptr对象所指对象的释放提供了自动管理。其有三种定义形式,auto_ptr< type_point_to> identifier,auto_ptr<type_point_to> identifier(ptr_allocated_by_new),auto_ptr<type_point_to> identifier(auto_ptr_of_same_type)。几点注意事项:1、当一个auto_ptr对象被另一个auto_ptr对象初始 化或者赋值时,左边被赋值或者初始化的对象就拥有了底层对象的所有权,而右边的对象则撤销所有责任;    2、判断auto_ptr是否指向一个对象的操作是if (p_auto.get() != 0);;    3、我们不能在auto_ptr对象被定义之后,在用new表达式创建对象的地址来直接向其赋值,而必须使用reset()函数, p_auto.reset( new int(1024) );注意reset是先删除了在重置,而assign则是直接重新赋值。    4、get()返回底层对象的地址,而release()则是先释放对底层对象的所有权,再返回底层对象的地址。    5、初始化或者赋值auto_ptr对象的指针必须是用new表达式动态分配的内存。

3、定位new表达式(<new>)允许程序员将对象创建在已经分配好的内存中,形式为new (place_address) type-specifier;其中place_address为指向预分配内存的指针,注意不存在与定位new表达式相匹配的delete表达式,因为 定位new表达式并没有实际分配内存,但是需要对开始预分配的内存(place_address所指)应用delete操作。

4、new()和delete()作为类的成员函数,就可以承接自己类的内存管理权。其函数声明分别为void *operator new(size_t);, void operator delete(void *,size_t);,其size_t参数被自动初始化为所属类的大小。具体的内存分配策略式管理一个链表,其结点由该类对象组成,对于new则分配一个 结点,对于delete的释放一个结点。最后注意操作符new()和delete()都是类的静态成员且无须程序员的显式声明,故其没有this指针,只 能访问类的静态数据成员。

5、创建数组的new表达式首先调用类操作符new[]()来分配内存,然后调用缺省构造函数依次初始化数组的每一个元素,所以如果该类没有缺省构造函数,则相应的new表达式就是错误的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值