动态内存与智能指针
Posted wsw_seu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态内存与智能指针相关的知识,希望对你有一定的参考价值。
全局对象在程序启动时分配内存,在程序结束时销毁。对于局部自动变量,我们进入其定义所在的程序块时被创建,离开时被销毁。局部static对象在第一次使用前分配,程序结束时销毁。
什么叫局部自动对象和局部静态对象呢?形参和函数体内部定义的变量称为局部变量。对于普通局部变量,当函数的控制路径经过变量定义语句时创建该对象,当到达定义所在的块末尾时销毁。我们把只存在于块执行期间的对象称为自动对象。形参是一种自动对象,函数开始时为形参申请内存,形参定义在函数体作用域之外,所以一旦函数终止,形参也被销毁。某些时候我们需要令局部变量的生命周期贯穿函数调用之后的时间。可以将局部变量定义成static类型从而获得这样的变量。局部静态对象在程序第一次执行经过该对象定义语句时初始化,并且直到程序结束时才销毁。在此期间,即使对象所在的函数体结束执行也不会对它有影响。
静态内存用来保存局部静态对象,类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static变量。
智能指针的本质思想:将堆对象的生命周期用栈对象(智能指针)来管理,当new一个堆对象时,立刻用智能指针来接管。具体做法是:
在构造函数中进行初始化(用一个指针指向堆对象),在析构函数中调用delete来释放对象。
由于智能指针本身是一个栈对象,它的作用域结束的时候,自动调用析构,从而调用了delete释放了堆对象
1 #include<boost/scoped_ptr.hpp> 2 #include<iostream> 3 using namespace std; 4 class X 5 { 6 public: 7 X() { cout << "X..." << endl; } 8 ~X() { cout << "~X..." < endl; } 9 }; 10 int main() 11 { 12 cout << "Enteringmain..." << endl; 13 { 14 //创建智能指针栈对象p,管理X 15 //在构造函数中进行初始化(用一个指针指向堆对象),在析构函数中调用delete来释放对象。 16 //scoped_ptr所有权不能转移,不能进行拷贝,也不能被赋值。 17 boost::scoped_ptr<X> p(new X); 18 } 19 cout << "Exiting main..." << endl; 20 return 0; 21 } 22 /* 23 Entering main... 24 X... 25 ~X 26 Exiting main... 27 */ 28 29 //shared_ptr线程安全的 30 #include<boost/shared_ptr.hpp> 31 #include<iostream> 32 using namespace std; 33 class X 34 { 35 public: 36 X() { cout << "X..." << endl; } 37 ~X() { cout << "~X..." < endl; } 38 }; 39 int main() 40 { 41 cout << "Enteringmain..." << endl; 42 //构造一个堆对象,用一个智能指针来管理。 43 //首先调用new,再调用p1的构造函数,创建一个指针来指向X 44 boost::shared_ptr<X> p1(new X); 45 cout << p1.use_count() << endl; 46 boost::shared_ptr<X> p2=p1; 47 cout << p2.use_count << endl; 48 p1.reset();//p1断开 49 cout << p2.use_count << endl; 50 p2.reset();//引用计数变为0,自动释放 51 cout << "Exiting main..." << endl; 52 return 0; 53 } 54 /* 55 Enteringmain... 56 X... 57 1 58 2 59 1 60 ~X... 61 Exiting main... 62 */
以上是关于动态内存与智能指针的主要内容,如果未能解决你的问题,请参考以下文章