c++特有的动态分配内存new操作符
来源:互联网 发布:windows平板电脑 i5 编辑:程序博客网 时间:2024/04/28 09:02
在C语言中我们使用malloc()、calloc()、realloc()库函数来动态分配内存,当然也适用于C++,但在C++中有更好的方法———new运算符。
通过new来动态分配内存并返回分配的内存首地址。
例如: int *ps=new int ;
或者开辟一个内存块
int *pt=new int [10];
同样动态分配的内存 使用过后要记得回收给系统,用delete 释放
#include<iostream>using namespace std;int main(){ int *ps= new int; int *pt = new int [10]; delete ps; delete [] pt; return 0;}
使用new ,delete要遵循以下规则:
1.不要使用delete来释放不是new分配的空间。
2.不要使用delete释放两次内存块。
3.new ,delete 和new [ ] ,delete [ ]要匹配使用。
4.对空指针NULL使用 delete 是安全的。
对于一个类来说 ,要用new给它的对象分配空间,就必须调该类的构造函数,创建出的对象如果系统不再使用的时候用delete来释放空间 就也要调用该类的析构函数来销毁对象。下面详细分析:
#include<iostream>using namespace std;class Test{public: Test() { _data = 0; //初始化数据成员 cout << "test()" << this<<endl ;//调用构造函数打印一遍地址 } ~Test() { cout << "~test()" << this<<endl;//调用析构函数打印一遍当前对象地址 }private: int _data;};int main(){ Test * pt = new Test; //分配一个对象 Test *ps = new Test[5];//分配五个对象 delete[] ps; delete pt; return 0;}
以上程序执行的结果为:
new分配内存的时候调了构造函数,delete销毁的时候调了析构函数。
但是delete不是每次都调析构函数,在以下情况下析构函数会被调用:
1.对象是动态的,则执行完成定义该对象的程序块时,将调用该对象的析构函数。
2.如果对象是静态对象时,结束时调用。
3.对象是new创立的,并且当显式使用delete删除对象时,析构函数才会被调用。
new Test [5]的时候会多申请Test个字节用来存放5 也就是创建对象的个数,以便以后释放的时候释放。
delete []的时候会先取存放的对象的个数((int )ps -1)==N
再析构对象 for循环析构N次 释放。
最后关于定位new表达式
int array[10];
array[4]=0;
就等价于 new (array+4) int(4)
定位new表达式可以在已经开辟好的内存上创建对象,调用构造函数。
原型为 operator new(size_t ,where) where为该内存的首地址。
- c++特有的动态分配内存new操作符
- C++【堆内存的动态分配与释放(new/delete)】
- C++关于new动态分配内存的问题
- 动态分配内存之new
- C语言的动态分配内存
- C++ 动态分配内存的(new)之撤销内存的(delete)
- C++动态分配内存new delete
- C++动态分配内存new delete
- C++动态分配内存new delete .
- C++动态分配内存new delete
- C++之 new 动态分配内存
- C++动态分配内存 new delete
- Effective C++(十一):为需要动态分配内存的类声明一个复制构造函数和一个赋值操作符
- new和delete运算符用于动态分配和撤销内存的运算符
- new和delete运算符用于动态分配和撤销内存的运算符
- new和delete运算符用于动态分配和撤销内存的运算符
- 2017.8.21 动态分配和撤销内存的运算符new和delete
- 关于malloc和new动态分配内存的困惑
- Nodejs mysql 数据库增、删、改、查 操作
- 彩色棒----图的连通性和欧拉路存在性
- 带分数
- 1014 Uniform Generator
- 这个fork到底输出6个还是8个?
- c++特有的动态分配内存new操作符
- hibernate 某一字段部分内容是自动生成 怎么实现?
- Linux下的Memcached安装
- 剑指offer--替换字符
- 穿透校园局域网 做到无服务商外网访问
- laravel csrf
- USCAO 热浪
- Android Studio中的Gradle文件基础
- android TabLayout+ViewPager配合使用