new、malloc和alloctor关系
来源:互联网 发布:施工现场平面图 软件 编辑:程序博客网 时间:2024/06/05 23:42
今天看C++primer,看到了动态内存管理类,alloctor,也涉及到free,对此有些不清楚,故收集整理一下,理清知识点。
http://blog.sina.com.cn/s/blog_9054a0360101289p.html
首先来说new和malloc。
new-delete;malloc-free
1、new 是c++中的操作符,malloc是c 中的一个函数
2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数
3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
4.new可以看成两个动作:1。分配内存(相当于malloc)2。引发构造函数。
5、new是操作符,和+、-、*一样,malloc是函数调用。6、new是保留字,不需要头文件,malloc需要头文件,其头文件是malloc.h或alloc.h。
7、new创建的是一个对象,malloc创建的是一块内存。
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.
8、new 和 malloc效率比较
new 有三个字母, malloc有六个字母
new可以认为是malloc加构造函数的执行。
new出来的指针是直接带类型信息的。
而malloc返回的都是void指针。
一:new delete 是运算符,malloc,free是函数
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例。
class Obj
{
public :
Obj(void){ cout << “Initialization” << endl; }
~Obj(void){ cout << “Destroy” << endl; }
void
void
};
void UseMallocFree(void)
{
Obj
a->Initialize();
//…
a->Destroy();
free(a);
}
void UseNewDelete(void)
{
Obj
//…
delete a;
}
类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。
所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
二:new delete在实现上其实调用了malloc,free函数。
三:new operator除了分配内存,还要调用构造函数。
malloc函数只是负责分配内存。
接下来说一下alloctor。alloctor-Destroy
alloctor是C++中的类,是是标准 C++ 库中多个容器模板类的构造函数中指定的默认分配器对象。
alloctor分配的内存是未构造的,需要添加新元素时用alloctor的construct成员在原始内存中创建对象。删除元素时,用Destroy成员销毁元素。
该类还有四个工具函数
alloc_n_copy会分配内存,并拷贝一个给定范围中的元素。
free会销毁构造的元素并释放内存
chk_n_alloc保证StrVec(类,特异性容器,自定义)至少有容纳一个元素的空间。若没有空间,将会调用reallocate分配更多内存
reallocate在内存用完时为StrVec分配新内存
- new、malloc和alloctor关系
- new/delete和malloc/free的关系
- new/delete和malloc/free的关系与区别
- malloc以及malloc和new
- new、delete、malloc、free关系
- new、delete、malloc、free关系
- new、delete、malloc、free关系
- new/delete、malloc/free关系
- malloc new 和 opeartor new
- new,malloc和::operator new
- malloc和new区别
- malloc和new区别
- new 和 malloc
- new 和malloc
- new和malloc区别?
- malloc和new区别
- new和malloc区别
- malloc和new区别
- HBase之Java API
- 导入项目出现AppBaseTheme找不到的情况解决办法
- HTML5语言的28个新特性学习
- RMAN中常用backup命令
- Oracle RAC 客户端连接负载均衡(Load Balance)
- new、malloc和alloctor关系
- hdu 3466 Proud Merchants(0-1背包+排序)
- Alice and Bob(贪心HDU 4268)
- LeetCode题解:Number of 1 Bits
- Android 扫描wifi局域网ip
- SQL语句执行效率测试
- 用户登录验证Ajax实例详解
- 第K极值
- 【codevs天梯&青铜Bronze】解题报告