12.1 动态内存与智能指针
Posted ChenZhongzhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12.1 动态内存与智能指针相关的知识,希望对你有一定的参考价值。
//练习12.10-11 shared_ptr<int> p(new int(42)); //process(p); //process(shared_ptr<int>(p)); //用p来初始化创建一个临时的智能指针 //也指向p所指向的内存 process(shared_ptr<int>(p.get())); //用p.get()返回的内置指针来初始化创建一个 //临时的智能指针,指向p所指向的内存 //当离开process函数的作用域时,这个临时智能指针会被销毁 //其所指向的内存也被释放掉 //因为调用结束后指向这块内存的智能指针数为0 //导致再次使用这块内存时会得到未定义的结果
int i = *p; cout << i;
//练习12.11的函数
void process(shared_ptr<int> ptr)
{
//Do Something...
}
//练习12.12 auto p = new int(); auto sp = make_shared<int>(); process(sp); //正确 //process(new int()); //错误,传入的是一个局部临时int*内置指针 //process(p); //错误,传入的是一个int*内置指针 process(shared_ptr<int>(p)); //正确,将int*指针强制类型转换为智能指针 //并传入一个临时局部的智能指针 //函数调用返回时这个局部指针会被销毁 //计数变为0 //其指向的空间也将会被自动释放
//练习12.13 auto sp = make_shared<int>(42); auto p = sp.get(); delete p; //没有释放其所指向的内存 //因为仍有智能指针sp指向这块内存 //计数为1 cout << sp.use_count() << endl; cout << *sp << " " << *p;
切忌混用智能指针和内置指针,特别是用内置指针初始化智能指针,即
int *p = new int(42); shared_ptr<int> sp(p);
以上是关于12.1 动态内存与智能指针的主要内容,如果未能解决你的问题,请参考以下文章