C++ 动态内存分配
来源:互联网 发布:企业阿里云邮箱登陆 编辑:程序博客网 时间:2024/06/06 03:03
通常,我们在声明一个数组时,数组的元素个数是确定的,即是一个常数。在编译的时候,编译器会根据数组的大小分配好内存。
如果我们需要在运行时决定数组的大小,比如接受用户的输入。此时,如果你试图用变量来代替常量,编译器则不允许通过。
在C++中,提供了两个专有的操作符,new delete
new基本格式是:
new data_type;new data_type[array_element_size];
new后面跟一个数据类型,比如int,double等。如果只请求一组元素,则需添加一个中括号,中括号里存储数组的大小,可以是常量,也可以是变量。
new操作符返回的是一个相应类型的指针。如果请求的是一个元素,则该指针指向该元素的第一个字节。如果是数组,则指向该数组的第一个元素的第一个字节。
如果数组的大小太大,比如用户申请10亿个数组,则分配失败,会抛出异常。为了简单起见,我们可以在 new后加一个参数nothrow,如果内存分配失败,则返回一个null的指针。
对于动态分配的数组访问,可以有两种方法,如果我们想访问第1个元素,pointer[0] or *(pointer+0)
new的一个简单例子:
int main(){int i;int * pointer;cout<<"请输入一个数字"<<endl;cin>>i;pointer = new(nothrow) int[i];if(pointer == 0){cout<<"动态内存分配失败"<<endl;}else{cout<<"内存分配成功"<<endl;}}
该例子中声明了一个变量i,用来存储用户输入的数字。然后通过new操作符动态申请内存,如果申请成功,将该数组的第一个元素的指针返回给pointer。否则返回null。
动态分配的内存存储在内存堆中(heap),因为我们知道内存是有限的,因此处理完之后应该释放空间,这里需要用到另一个操作符 delete。
delete基本格式:
delete pointer;delete[] pointer;
第一种格式是释放一个元素空间,第二种格式是释放一个数组空间。
所以上面的例子存在漏洞,修改之后:
int main(){int i;int * pointer;cout<<"请输入一个数字"<<endl;cin>>i;pointer = new(nothrow) int[i];if(pointer == 0){cout<<"动态内存分配失败"<<endl;}else{cout<<"内存分配成功"<<endl;}delete[] pointer;}
注意new 和delete操作符是C++专有的,C语言不含有该操作符,但是有其它操作动态内存分配的函数,比如malloc,realloc,calloc和free。C++如果包含<cstdlib>也可以使用该函数。
Over...
- c 动态内存分配
- c动态内存分配
- C动态内存分配
- 【C++】动态内存分配
- C动态内存分配
- C动态内存分配
- C动态内存分配
- C---动态内存分配
- C语言动态内存分配
- C中的动态内存分配
- C++/CLI 动态内存分配
- 【C基础】动态内存分配
- C语言动态内存分配
- C语言动态内存分配
- 动态内存分配(C++)
- C语言 动态内存分配
- C语言动态内存分配
- c语言:动态内存分配
- CvTermCriteria 迭代终止规则
- Core Java小练习 - 反转文字
- 定制new和delete
- 设置ssh登录无需密码
- 通过shell命令来控制hdfs
- C++ 动态内存分配
- 两部影响前半生的影片
- 堆和栈
- 引用 最简单的硬盘安装VISTA 2008 Win7 WIN2008R2方法
- 前端面试题
- Java Socket 实例
- 01背包问题的求解
- Goahead 文件上传速度过慢原因分析
- 黑马程序员_函数的理解