静态内存、栈内存、动态内存
- 静态内存:保存局部
static
对象;类static
对象、已经定义在任何函数之外的变量。 - 栈内存:保存定义在函数内的非
static
对象;
其中栈对象仅在其定义的程序块运行时才存在;static
对象在使用之前分配,程序结束时销毁。
- 内存池(称为堆
heap
):存储动态分配的对象,即在程序运行时分配的对象,动态内存不在使用时,代码必须显式地销毁它们。
提出智能指针:为了防止意外发生,针对new
与delete
处理失误的情况;
- 智能指针(
smart pointer
):定于在memory
头文件中,有shared_ptr
、unique_ptr
;伴随类weak_ptr
表示的弱引用。
shared_ptr
1 | shared_ptr<string> p1; //可以指向string |
1 | //如果p1不为空,检查它是否指向一个空string |
make_shared
函数
使用时必须指定想要创建的对象的类型:通常使用1
2
3
4
5shared_ptr<int> p3 = make_shared<int>(42);
//p4指向一个值为"999999999"的string
shared_ptr<string> p4 = make_shared<string>(10,'9');
//p5指向值初始为0的int
shared_ptr<int> p5 = make_shared<string>();auto
:1
auto p6 = make_shared<vector<string>>();
拷贝和赋值
1 | auto p = make_shared<int>(42); // p指向 的对象只有p一个引用 |
可以认为被一个shared_ptr
都关联一个引用计数,一旦计数器的值变为0,它就会自动释放自己所管理的对象:
1 | auto r = make_shared<int>(42); //r指向的int只有一个引用者 |
下面的例子展示了使用动态内存的一个常见的原因是允许多个对象共享相同的状态:
1 | Blob<string> b1; //空Blob |
练习12-2:定义自己的const
函数:
1 | // |
12-3:需要为上面的类添加const
版本的push_back
和pop_back
吗
参考:https://www.douban.com/group/topic/61573279/
Ans:
可以用的原因,因为修改的不是指针,而是指针指向的数据,因此完全可以用const
指针。
不可以用的原因:虽然在类的具体实现中,数据成员是一个指向vector的智能指针;但由于类的封装,在类的使用者看来,数据成员是vector,他们并不知道具体的实现使用了智能指针。那么当类的使用者声明类的常量对象时,他们期待的结果是vector的内容不会被改变。所以我们在设计这个类的时候,要考虑到类的使用者的真实意图,对于像push_back和pop_back这样会改变智能指针所指向的vector内容的成员函数,我们不应该声明和定义成const版本。这样在类的使用者使用类的常对象时,就不能调用push_back和pop_back成员函数,不能改变智能指针所指向的vector的内容了,这正好与类的使用者的意图相符。
Related Issues not found
Please contact @zhengchu1994 to initialize the comment