(转) Dynamic memory
In the programs seen in previous chapters, all memory needs were determined before program execution by defining the variables needed. But there may be cases where the memory needs of a program can only be determined during runtime. For example, when the memory needed depends on user input. On these cases, programs need to dynamically allocate memory, for which the C++ language integrates the operators new
and delete
.
Operators new and new[]
Dynamic memory is allocated using operator new
. new
is followed by a data type specifier and, if a sequence of more than one element is required, the number of these within brackets []
. It returns a pointer to the beginning of the new block of memory allocated. Its syntax is:
- pointer = new type //allocate memory to contain one single element of type
type
pointer = new type [number_of_elements] //allocate a block (an array) of elements of typetype
The first expression is used to allocate memory to contain one single element of type type
. The second one is used to allocate a block (an array) of elements of type type
, where number_of_elements
is an integer value representing the amount of these. For example:
- int * foo; foo = new int [];
In this case, the system dynamically allocates space for five elements of type int
and returns a pointer to the first element of the sequence, which is assigned to foo
(a pointer). Therefore, foo
now points to a valid block of memory with space for five elements of type int
.
first element | second element |
|
|
the pointed to by foo
Here,
foo
is a pointer, and thus, the first element pointed to by foo
can be accessed either with the expression foo[0]
or the expression *foo
(both are equivalent). The second element can be accessed either with foo[1]
or *(foo+1)
, and so on...
- difference between declaring a normal array and allocating dynamic memory for a block of memory using
new
The most important difference is that the size of a regular array needs to be a constant expression, and thus its size has to be determined at the moment of designing the program, before it is run, whereas the dynamic memory allocation performed by new
allows to assign memory during runtime using any variable value as size.
The dynamic memory requested by our program is allocated by the system from the memory heap. However, computer memory is a limited resource, and it can be exhausted. Therefore, there are no guarantees that all requests to allocate memory using operator new
are going to be granted by the system.
C++ provides two standard mechanisms to check if the allocation was successful:
One is by handling exceptions. Using this method, an exception of type bad_alloc
is thrown when the allocation fails. Exceptions are a powerful C++ feature explained later in these tutorials. But for now, you should know that if this exception is thrown and it is not handled by a specific handler, the program execution is terminated.
This exception method is the method used by default by new
, and is the one used in a declaration like:
- foo = new int []; // if allocation fails, an exception is thrown
The other method is known as nothrow
, and what happens when it is used is that when a memory allocation fails, instead of throwing a bad_alloc
exception or terminating the program, the pointer returned by new
is a null pointer, and the program continues its execution normally.
This method can be specified by using a special object called nothrow
, declared in header <new>
, as argument for new
:
|
|
In this case, if the allocation of this block of memory fails, the failure can be detected by checking if foo
is a null pointer:
|
|
This nothrow
method is likely to produce less efficient code than exceptions, since it implies explicitly checking the pointer value returned after each and every allocation. Therefore, the exception mechanism is generally preferred, at least for critical allocations. Still, most of the coming examples will use the nothrow
mechanism due to its simplicity.
Operators delete and delete[]
In most cases, memory allocated dynamically is only needed during specific periods of time within a program; once it is no longer needed, it can be freed so that the memory becomes available again for other requests of dynamic memory. This is the purpose of operator delete
, whose syntax is:
- delete pointer; delete[] pointer;
The first statement releases the memory of a single element allocated using new
, and the second one releases the memory allocated for arrays of elements using new and a size in brackets ([]
).
The value passed as argument to delete
shall be either a pointer to a memory block previously allocated with new
, or a null pointer (in the case of a null pointer, delete
produces no effect).
|
|
|
Notice how the value within brackets in the new statement is a variable value entered by the user (i
), not a constant expression:
|
|
There always exists the possibility that the user introduces a value for i
so big that the system cannot allocate enough memory for it. For example, when I tried to give a value of 1 billion to the "How many numbers" question, my system could not allocate that much memory for the program, and I got the text message we prepared for this case (Error: memory could not be allocated
).
It is considered good practice for programs to always be able to handle failures to allocate memory, either by checking the pointer value (if nothrow
) or by catching the proper exception.
Dynamic memory in C
C++ integrates the operators new
and delete
for allocating dynamic memory. But these were not available in the C language; instead, it used a library solution, with the functions malloc
, calloc
, realloc
and free
, defined in the header<cstdlib>
(known as <stdlib.h>
in C). The functions are also available in C++ and can also be used to allocate and deallocate dynamic memory.
Note, though, that the memory blocks allocated by these functions are not necessarily compatible with those returned bynew
, so they should not be mixed; each one should be handled with its own set of functions or operators.
(转) Dynamic memory的更多相关文章
- 论文笔记:Learning Dynamic Memory Networks for Object Tracking
Learning Dynamic Memory Networks for Object Tracking ECCV 2018Updated on 2018-08-05 16:36:30 Paper: ...
- c++ Dynamic Memory (part 1)
1. make_shared<T>(args): return a shared_ptr dynamically allocated object of type T. Use args ...
- 动态内存分配(Dynamic memory allocation)
下面的代码片段的输出是什么?为什么? 解析:这是一道动态内存分配(Dynamic memory allocation)题. 尽管不像非嵌入式计算那么常见,嵌入式系统还是有从堆(heap)中动态分 ...
- 从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory
摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...
- c++ Dynamic Memory (part 2)
Don't use get to initialize or assign another smart pointer. The code that use the return from get c ...
- [Paper翻译]Scalable Lock-Free Dynamic Memory Allocation
原文: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.87.3870&rep=rep1&type=pdf Abstr ...
- C++ storage allocation + Dynamic memory allocation + setting limits + initializer list (1)
1. 对象的空间在括号开始就已经分配,但是构造在定义对象的时候才会实现,若跳过(譬如goto),到括号结束析构会发生错误,编译会通不过. 2.初始化 1 struct X { int i ; floa ...
- 基于神经网络的混合计算(DNC)-Hybrid computing using a NN with dynamic external memory
前言: DNC可以称为NTM的进一步发展,希望先看看这篇译文,关于NTM的译文:人工机器-NTM-Neutral Turing Machine 基于神经网络的混合计算 Hybrid computing ...
- (C/C++) Interview in English. - Memory Allocation/Deallocation.
Q: What is the difference between new/delete and malloc/free? A: Malloc/free do not know about const ...
随机推荐
- [Leetcode] Merge Sorted Array (C++)
我在Github上新建了一个解答Leetcode问题的Project, 大家可以参考, 目前是Java 为主,里面有leetcode上的题目,解答,还有一些基本的单元测试,方便大家起步. 题目: Gi ...
- [Mac] 使用Mac时的一些技巧
这篇博客就用来记录自己在使用Mac时学来的一些技巧吧! 1. 如何开启 Sticky key (在屏幕上显示输入的控制键) 就是这个东西啦,就是在视频演示的时候让别人看到自己按了什么控制键. 在s ...
- C++内存对象布局
本章主要介绍了c++类中成员变量.函数对象的在内存中布局. 当c++类中不包含virtual机制类的函数时,内部nostatic member被包含在每一个class object之中,就想c str ...
- python 学习(三)
按照上次python 学习(二)的思路,第一步要实现从一个网站的页面上自动获取指定列表中的信息.折腾数日,得到一段可以正常运行的代码,如下: #web2.py import re import url ...
- linux系统结构和系统命令初步
以上是第五课和第14课笔记 linux 基本结构: 系统构成:kernel,Modules,Lib,(Shell,Tool)系统引导:BIOS -> Bootlooder -> Kerne ...
- 异常处理:你不可能总是对的 - 零基础入门学习Python032
异常处理:你不可能总是对的 让编程改变世界 Change the world by program 因为我们是人,不是神,所以我们经常会犯错.当然程序员也不例外,就算是经验丰富的码农,也不能保证写出来 ...
- OC和C语言的混编注意点和好处
苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就能够在Objective-C利用过程中利用 ...
- Qt HTTP请求同步调用
在Qt中,进行HTTP就行现在官方提倡使用QNetworkAccessManager,其和QNetworkRequest和QNetworkReply配合使用,来完成,其是只支持异步的操作.最近使用QM ...
- Grid++Report 数据填充教程
用 Grid++Report的报表设计器应用程序设计一个简单的报表:“机房开发收入总汇表” 一.定义报表头 1.执行菜单命令“插入”→“报表头” 2.执行菜单命令“插 ...
- 【剑指offer】面试题27:二叉搜索树与双向链表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 假设已经处理了一部分(转换了左子树),则得到一个有序的双向链表,现在 ...