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表达式就是错误的。
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表达式就是错误的。