c++ Dynamic Memory (part 1)
1. make_shared<T>(args): return a shared_ptr dynamically allocated object of type T. Use args to initialize the object.
shared_ptr<T> p(q): p is a copy of shared_ptr q. Increase the count in q. The pointer in q must be convertable to T.
p = q: p and q are shared_ptr holding pointers that are convertable to one another. Decrease p's reference count, and increase q's count; delete p's existing memory if p's count goes to zero.
p.use_count(): return the number of objects sharing with p. Intended for debug purpose.
2. Ordinarily we use auto to make it easier to define an object to hold the result of make_shared:
- auto p1 = make_shared<revector<string>>();
- auto p2 = make_shared<int>();
- auto p(q); // p and q point to the same object
3. The fact that the shared_ptr class automatically free dynamic objects when they are no longer needed makes it fairly easier to use dynamic memory.
- // factory return a shared_ptr pointing to a dynamically allocated object
- shared_ptr<Foo> factory(T arg)
- {
- // process arg as a appropriate
- // shared_ptr will take care of deleting the memory
- return make_shared<Foo>(arg);
- }
- void use_factory(T arg)
- {
- shared_ptr<Foo> p = factory(arg);
- // use p
- } // p goes out of scope. The memory to which p points is automatically free
4.If you put shared_ptrs into a container, you should be sure to erase shared_ptr elements once you no longer need those elements.
Programs tend to use dynamic memory for one of three purpose:
- They don't know how many object they will need
- They don't know the precise type of the object they need.
- They want to share data between serval objects.
So far, the classes we have used allocate resources that exist only as long as the corresponding object
- vector<string> v1;
- {
- vector<string> v2 = {"a", "aa", "bbb"};
- v1 = v2; // copies the elements in v2 to v1
- } // v2 is deleted, which destroys the elements in v2
- // v1 has three new copied elements
Two operators allocate and delete dynamic memory:
- new: allocates memory
- delete: frees memory allocated by new.
Use these two operator is more error-prone than using a smart pointer.
A dynamic object managed through a build-in pointer exists until it is explictly deleted
- Foo factory(T arg)
- {
- return new Foo(arg); // caller is responsible for deleting this memory
- }
- void use_factory(T arg)
- {
- Foo *p = use_factory(arg);
- // use p but do not delete it
- } p goes out of scope, but the memory to which p points is not freeed.
In this example, p was the only pointer to memory allocated by factory. Once use_factory returns, the program has no way to free the memory. Then memory leak.
There are three common problem with using new and delete to manage dynamic memory:
- Forgetting to delete memory, which is known as memory leak
- Using a object after it has been deleted
- Deleting the same object twice
We should use smart pointers rather than plain pointers
If we do not initialize a smart pointer, it is initialized as a null pointer. We can also initialize a smart pointer from a pointer return from new
- shared_ptr<double> p1;
- shared_ptr<int> p2(new int());
The smart pointer constructors that take pointers are explict. We can not implictly conver a build-in pointer to a smart pointer.
- shared_ptr<int> p1 = new int(); // error
- shared_ptr<int> p2(new int()); // ok. use direct initilization
A function that return a shared_ptr cannot implictly return a plian pointer in its return statement
- shared_ptr<int> clone(int p)
- {
- return new int(p); // error
- }
- shared_ptr<int> clone(int p)
- {
- // ok; explicitly create a shared_ptr from int *
- return shared_ptr<int>(new int(p));
- }
Don't mix ordinary pointers and smart pointers.
When we bind a shared_ptr to a pain pointer, we give responsibility for that memory to the shared_ptr, and we should no longer use a build-in pointer to access the memory to which the shared_ptr now points.
Don't use get to initilize or assign another smart pointer.
c++ Dynamic Memory (part 1)的更多相关文章
- (转) Dynamic memory
In the programs seen in previous chapters, all memory needs were determined before program executi ...
- 论文笔记:Learning Dynamic Memory Networks for Object Tracking
Learning Dynamic Memory Networks for Object Tracking ECCV 2018Updated on 2018-08-05 16:36:30 Paper: ...
- 动态内存分配(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 ...
随机推荐
- 如何设计处优秀的Restful API
只知道遵规循矩的程序员是假程序员,任何技术都是不断发明创造改进的. 如何设计处优秀的Restful API? 盲目跟风,设计糟糕的Resful API = 浪费时间 ! 不啰嗦,直接进入技术主题: ...
- 今天在Qt子界面中的Button,转到槽转不过去,报错Qt The class containing 'Ui::MainWindow' could not be found in...
在网上查了原因,因为我在修改button的名字时,没选中button,选中了子界面对话框Dialog,然后修改了名字,又没有改回去,所以button转到槽报错. 参考网站: https://zhida ...
- JQuery弹出Dialog关闭方式close vs destroy
$editDialog.iDialog('close') $(this).dialog('close'); 等Close方法关闭Dialog时,Dialog并不是完全消失,只是隐藏起来.两个Dial ...
- js实现table合并相同列单元格
/** * Created with JetBrains WebStorm. * User: Johnny * Date: 18-3-26 * Time: 下午4:48 * Table td 相同值合 ...
- Spring AOP代理模式
代理模式 代理模式是一种设计模式,提供了对目标对象的另外的访问方式.即通过代理访问目标对象. 好处:可以再目标对象实现的基础上,增加额外的功能的操作.扩展目标对象的功能,而不改变现有的功能逻辑. 1. ...
- 关于flume的filechannel的 full 问题
事务启动以后,批量向事务Transaction的一个putList的尾部写入,putlist是一个LinkedBlockingDeque . 事务提交的时候, 把putlist中的event批量移除, ...
- sqoop import/export使用经验
一.先创建一个小表(test_01)进行测试(主节点IP:169.254.109.130/oracle服务器IP:169.254.109.100) 1.测试连接oracle; sqoop list-t ...
- Python 装饰器装饰类中的方法(转)
def catch_exception(origin_func): def wrapper(self, *args, **kwargs): try: u = origin_func(self, *ar ...
- PTA基础编程题目集6-6求单链表结点的阶乘和(函数题)
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义 ...
- 20155304 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践
实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软件工程包括下列领 ...