mallloc/free和new/delete
来源:互联网 发布:wordpress分类目录seo 编辑:程序博客网 时间:2024/06/06 09:29
首先我们来回顾一下在C语言中有哪些可以用于动态内存开辟的函数:
注意:这三个函数都是在堆上开辟的内存,需要用户自己来管理,所以一定要和free()函数配对使用,否则会造成内存泄漏。
动态内存开辟常见错误:
1、对NULL指针进行解引用操作(tip:开辟完先检查是否开辟成功再使用)
2、对分配的内存进行操作时越界(tip:开辟内存时,开辟足够的空间)
3、释放非动态开辟的内存(tip:开辟时用哪个指针接收的就free掉哪个指针)
4、忘记释放(tip:写开辟内存函数和free()函数配对使用)
5、释放一块动态分配的内存的一部分(tip:操作时用一个临时的指针代替内存的地址,避免改变接收内存时的指针的指向)
6、一块动态内存被释放后被继续使用(tip:将一块空间释放掉后,将指向这块空间的指针赋成NULL)
现在来看一下new/delete的用法:
在C++ 中一般通过new和delete运算符进行动态内存管理。new用于开辟内存,delete用于释放内存。
new的作用是:1、调用operator new 分配空间 2、调用构造函数初始化对象
delete的作用:1、调用析构函数清理对象 2、调用 operator new释放对象
new[ ]的作用:1、调用operator new分配空间 2、调用N次析构函数分别初始化每个对象
delete[ ]的作用:1、调用N次析构函数清理对象 2、调用operator delete 释放空间
举个例子:
#include <iostream>using namespace std;class Array{public:Array(size_t size = 10)//构造函数:_size(size)//_size被初始化为10, _a(0){cout << "Array(size_t size)" << endl;if (_size > 0)//{_a = new int[size];//开辟10个整型大小的内存}}~Array()//析构函数{cout << "~Array()" << endl;if (_a){delete[] _a;_a = 0;_size = 0;}}private:int *_a;size_t _size;};void Test(){Array* p1 = (Array*)malloc(sizeof (Array));Array* p2 = new Array;//调用一次构造函数Array* p3 = new Array[10];//调用10次构造函数free(p1);delete p2;//调用一次析构函数delete[] p3;//调用十次析构函数}int main(){Test();return 0;}
运行结果为:
正好是分别调用了11次构造函数和析构函数
注意:对于new type [ ] 只有显示定义析构函数的时候会多开辟4个字节来存储对象个数
定位new表达式:
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
使用格式有两种:
1、new (place_address) type
2、new (place_address) type (初始化列表)
malloc/free和new/delete的异同:
共同点:都是从对堆上来开辟空间,用户需要自己管理。
不同点:
- mallloc/free和new/delete
- malloc/free和new/delete
- new/delete 和 malloc/free
- malloc free 和new delete
- malloc/free和new/delete
- malloc/free 和 new/delete
- malloc/free和new/delete
- new/delete和malloc/free
- malloc/free和new/delete
- new、delete和malloc、free
- malloc-free和new-delete
- new/delete和malloc/free
- malloc/free和new/delete
- new delete和mallco free
- malloc()、free()和new、delete
- new,delete和malloc,free
- malloc/free和new/delete
- malloc/free和new/delete
- System类中环境属性
- tomcat服务设置开机自动启动模式!
- h3c 构建中小企业网络 实验手册 第3章 笔记
- linux安全-禁止密码登录及root登录
- 支付开发(六)----支付宝支付的几种方式
- mallloc/free和new/delete
- Android中关于Handle的用法和分析
- vb.net 教程 3-12 资源文件 1-1
- 多线程操作数据库时为了防止数据的增删改的混乱该在数据库层还是程序层面上进行同步?
- js + jquery 实现无限加载页面的分页(类似京东手机版)
- 在Cygwin跨平台编译GTK+程序
- RxFile 一款选择多媒体文件精巧的工具类
- Python爬虫防封杀方法集合
- 猜数字游戏