new,delete和malloc,free以及allocator<T>
一)new和delete,自己觉得一句话就是:最好同一作用域内,必须成对使用
先给出自己的认识:
malloc,free,申请和释放一段heap堆中的内存。
new:申请heap内存并在申请的内存中放置用默认构造函数构造好的对象。(注意:对象内可能也有申请堆内存,new)
delete:完成了两个工作,
1. 释放对象内申请的堆内存。 所以会去调用析构函数。
2. 释放对象本身占用的堆内存。类似free 对象指针。
如下例子,明白了,就应该基本初步认识了new和delete。
#include <stdio.h>
#include <iostream>
using namespace std; class myclass
{
public:
myclass(const string& _name,const string& _des):name(_name),heaporstack(_des)
{
pint=new int[]{,,,,,,,,,};
printf("%s Construt by %s. add of class:%0x\. add of int[] in class:%0x0 \n",name.c_str(),heaporstack.c_str(), this,pint);
};
~myclass()
{
delete[] pint;
printf("%s Destory by %s. add of class:%0x\. add of int[] in class:%0x0 \n",name.c_str(),heaporstack.c_str(), this,pint);
}
string name;
string heaporstack;
int * pint; private:
myclass(){}
}; int main()
{
myclass Mclass_local("Mclass_local","stack"); myclass* Mclass_heap=new myclass("Mclass_heap","heap");
delete Mclass_heap;
Mclass_heap=0x0;
return ;
}
所以,使用基本原则:
1)成对使用。new 对 delete . new a[] 对 delete [] a;
2)谁new谁delete。 mian方法中,new,那么main必须delete。 class 中new。那么class的析构函数~class{delete} 最好有delete。也就是最好同一作用域内。
3)delete后,必须把指针设置为空指针。当然在析构函数内其实不用写。因为析构是最后执行的,类里面不太会有语句在析构之后执行。
二)C++还有一个std::allocator<T>
作用:某些类,需要预先分配用于创建新对象的内存,需要时再在预先分配的内存中构造新对象。也就是以空间换时间的策略。
比如vector。就是典型的这种类,先分配一定大小,加入数据时,如空间够,不必要每次插入数据就申请一次空间,只有空间不够才再次申请原空间的2倍内存。典型的预支内存空间换申请内存时间的策略。
常用的操作:
allocator<T> a; 定义一个T类型的allocator对象。
a.allocate(n); 申请n个T大小的,未分配的空间。类似(T*) malloc(sizeof(T)*n)
a.deallocate(p,n) 释放内存,p为T*,n为释放的T类型对象的数量。注意:T类型对象本身,如有需要释放的资源,必须先释放,a.deallocate(p,n)只是释放对象本身的内存,而对象的建立又额外申请的资源,需要另外处理。
a.construct(p,t) 复制构造,用t来复制构造。相当于 new (p) T(t),这个是placement new的用法 new(place_address) type(initializer-list)
uninitialized_copy(startit,endit,it) startit,endit :要复制的开始迭代器地址和结束地址。it:要复制的迭代器地址。
(迭代器指向的类型是POD型别,不用构造,可以直接拷贝,不清楚具体处理,见链接,备了解。)
uninitialized_fill(startit,endit,obj) startit,endit :要复制的开始迭代器地址和结束地址。it:要复制的对象。 使用复制构造函数填充内存
uninitialized_fill_n(startit,endit,obj,n) startit,endit :要复制的开始迭代器地址和结束地址。it:要复制的对象。 n,要复制的数量。 使用复制构造函数填充内存
new,delete和malloc,free以及allocator<T>的更多相关文章
- new/delete和malloc/free的区别
通俗易懂版本:http://zhidao.baidu.com/question/86185100 1 new/delete和malloc/free最大区别是对对象的理解. 如果你使用 Foo* foo ...
- c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
1. 引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d; //引用 int * const e=d; //只读指针,e指向d,不可修改e指 ...
- new、delete与malloc、free的详解
内容清单: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
- new/delete 与 malloc/free的区别
一.概述 在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,而且他们的存储方式相同,new/malloc申请的动态内存位于堆中,无法被操作系统自动 ...
- new 、 delete 、 malloc 、 free 关系
1.new . delete . malloc . free 关系 delete 会调用对象的析构函数 , 和 new 对应, free 只会释放内存, new 调用构造函数. malloc 与 fr ...
- 关于new,delete,malloc,free的一些总结
首先,new,delete都是c++的关键字并不是函数,通过特定的语法组成表达式,new可以在编译的时候确定其返回值.可以直接使用string *p=new string("asdfgh&q ...
- C++之new、delete 与malloc、free的异同
在C/C++编程中常常会申请内存.而对内存的申请释放操作有两套方法: new.delete 与malloc.free.他们的使用最好是成对使用,不要去混搭---这可不是时尚界哦. 例如以下是这两组方法 ...
- C/C++——new/delete和malloc/free的区别
new/delete和malloc/free的区别 扩容操作: 对于malloc是有一个realloc函数对应用于扩容的: 对于new,只能再new一个,for循环赋值过去,把原来的delete掉: ...
- new/delete 和malloc/free 的区别
new/delete 和malloc/free 的区别 一.基本概念malloc/free:1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumB ...
随机推荐
- 修改Linux时间一般涉及到3个命令: date, clock, hwclock
原贴:http://203.208.37.104/search?q=cache:p1vAAHvs9ikJ:www.goldthe.com /blog/%3Faction%3Dshowlog%26gid ...
- PHP笔记随笔
1.CSS控制页面文字不能复制: body{-webkit-user-select:none;} 2.[php过滤汉字和非汉字] $sc="aaad....##--__i汉字过滤&quo ...
- JavaEE基础(二十三)/递归
1.File类递归练习(统计该文件夹大小) 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 2.File类递归练习(删除该文件夹) 需求:2,从键盘接收一个文件夹路径,删除该文件夹 3.File ...
- C#:将子Form加入父Form中
实现的功能:已建立了多个子Form界面,在父Form界面左面,点击不同标题的链接文本,父Form界面右面显示不同的子界面内容. 具体如下: 1.加入split拆分器控件 2.在splitControl ...
- PMO到底什么样?
PMO到底什么样? 当将来项目办理单位彻底健全了,达到最老练的程度的时分项目办理单位应当干哪些活,有哪些大块功能,也即是关于一个全部的PMO它的功能跟人物都包含啥? 下面这个模型精确的说是英国的项目办 ...
- 理解css中的position-static\relative\fixed\absolute
position属性有四个值: static(静态定位):是默认值,不会被特殊的定位,遵循正常的文档流对象,对象占用文档空间,该方式下,top.right.bottom.left.z-index等属性 ...
- 【TCP】超时与重传
在TCP连接中假设发送方一开始便向网络发送多个报文段,直到达到接收方通告的窗口大小为止.当发送方和接收方处于同一个区域网段时,这种方式是可以的.但是如果发送方和接收方之间存在多个路由器和速率较慢的链路 ...
- CentOS安装zookeeper
1.zookeeper是个什么玩意? 顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache ...
- 公共控件Listview
ListView属性中,Items是行的总集合,Items集合中的每一个是一行,Items集合里面有ListViewItem集合,这个集合实例化:ListViewItem li=new ListVie ...
- form 提交
1.方式1:字段加验证 @model MvcWeb.Models.UserInfo @{ ViewBag.Title = "Add"; } <h2>Add</h2 ...