一)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>的更多相关文章

  1. new/delete和malloc/free的区别

    通俗易懂版本:http://zhidao.baidu.com/question/86185100 1 new/delete和malloc/free最大区别是对对象的理解. 如果你使用 Foo* foo ...

  2. c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系

    1.      引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d;    //引用 int * const e=d; //只读指针,e指向d,不可修改e指 ...

  3. new、delete与malloc、free的详解

    内容清单: 1.  C语言中的函数malloc和free 2.  C++中的运算符new和delete 3.  new/delete与malloc/free之间的联系和区别 4.  C/C++程序的内 ...

  4. new/delete 与 malloc/free的区别

    一.概述     在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,而且他们的存储方式相同,new/malloc申请的动态内存位于堆中,无法被操作系统自动 ...

  5. new 、 delete 、 malloc 、 free 关系

    1.new . delete . malloc . free 关系 delete 会调用对象的析构函数 , 和 new 对应, free 只会释放内存, new 调用构造函数. malloc 与 fr ...

  6. 关于new,delete,malloc,free的一些总结

    首先,new,delete都是c++的关键字并不是函数,通过特定的语法组成表达式,new可以在编译的时候确定其返回值.可以直接使用string *p=new string("asdfgh&q ...

  7. C++之new、delete 与malloc、free的异同

    在C/C++编程中常常会申请内存.而对内存的申请释放操作有两套方法: new.delete 与malloc.free.他们的使用最好是成对使用,不要去混搭---这可不是时尚界哦. 例如以下是这两组方法 ...

  8. C/C++——new/delete和malloc/free的区别

    new/delete和malloc/free的区别 扩容操作: 对于malloc是有一个realloc函数对应用于扩容的: 对于new,只能再new一个,for循环赋值过去,把原来的delete掉: ...

  9. new/delete 和malloc/free 的区别

    new/delete 和malloc/free 的区别 一.基本概念malloc/free:1.函数原型及说明:      void *malloc(long NumBytes):该函数分配了NumB ...

随机推荐

  1. PHP删除MySQL数据库下的所有数据表

    <?php //[数据无价,请谨慎操作!] $hostname ='localhost';  $userid = 'username';  $password = 'password';  $d ...

  2. PHP获取客户端真实IP的自定义函数

    <?php //虽然使用 $_SERVER[REMOTE_ADDR] 也可以获取,但是要获取真实的客户端IP地址,需要使用下面的方法: function _getIP(){ $ip=getenv ...

  3. pgadmin(IDE)工具连接postgres数据库

    1. 下载软件        软件地址:http://www.pgadmin.org/download/pgagent.php   2.安装软件    安装过程:略    打开软件64位会出现  “无 ...

  4. oracle-odu小试牛刀--恢复drop表的数据

         现在进入oracle12c时代:普遍用的oracle版本为10g以上.在oracle10g之后提供了一个回收的机制.所以恢复drop表的数据以及表很容易.当然需要打开回收机制以及是归档模式. ...

  5. hdwiki 编码规范

    编码规范         命名规范 1.1.主要的目录 control 里面是控制类 ,前台命名为something.php,则后台对应的是admin_+前台名称,名称应选有意义的英文单词,例如 前台 ...

  6. android中广告轮播图总结

    功能点:无限轮播.指示点跟随.点击响应.实现思路: 1.指示点跟随,指示点通过代码动态添加,数量由图片数量决定. 在viewpager的页面改变监听中,设置点的状态选择器enable,当前页时,set ...

  7. JavaScript和angularJs语法支持严格模式:”use strict”

    如果给JavaScript和angularjs代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的.其一:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常.其二:如果在运 ...

  8. ACM题目————图的广度优先搜索

    题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...

  9. 关闭用miniUI打开的窗口

    miniUI打开的窗口用window.close关闭无效, 应该用window.CloseOwnerWindow();

  10. Combox控件初始化项的技巧

    有时候combox下拉项就是几条固定的,不需要做数据绑定,但是如果直接采用字符串集合编辑器的时候,SelectedValue貌似会不起作用. 于是简单的封装一下 /// <summary> ...