这一章介绍了标准库对动态内存的管理方面,其中12.1的几个智能指针是C11引入的非常实用的类。这章对优化C++代码的编写有很大意义,值得好好理解。至此第二部分"C++标准库"就看完了,下一篇是第二部分简单的总结,然后就是第三部分了。
12.1 动态内存与智能指针
12.1.1-12.1.4 shared_ptr
void test() {
// 传统的用new分配动态内存空间,返回值是对应类型的指针,构造的目标是默认初始化的
int* p1 = new int;
// 在类型符后加小括号后,目标会自动进行值初始化,更实用
int* p2 = new int();
// 用make_shared得到int的智能指针,此时会自动值初始化
shared_ptr<int> p3 = make_shared<int>();
// 也可以用内置指针来初始化智能指针,同样也可以直接用new的返回值
shared_ptr<int> p4 = make_shared<int>(p2);
// 如果用new分配动态内存的话记得在函数结尾要delete
delete p1;
// 如果此处没有delete p2的话,p2申请的空间将失去指向的指针,称为内存泄漏
// 但是智能指针由于内部保存了对空间的引用次数值,且拥有自动的析构函数
// 因此函数结束时指针的引用数会自动减少,当减少到0时会自动析构delete其内部的指针,防止了内存泄漏
}
// const初始化
const int* p = new const int;
// 推断类型
auto p2 = new auto(1);
// 自定义的删除器函数,常常用来处理那些由工厂产生的对象,如各种connection
void newDeleteFun(int* inp) {
// do sth
delete inp;
}
int main() {
// 第二个参数传入此可调用对象
auto p = make_shared<int>(2, newDeleteFun);
return 0;
}
12.1.5 unique_ptr
// 进行内置指针的初始化,初始化的动态int值为2
unique_ptr<int> p(new int(2));
// 需要指明删除器的类型
unique_ptr<int, decltype(newDeleteFun)*> p(new int(2), newDeleteFun);
12.1.6 weak_ptr
12.2 动态数组