码迷,mamicode.com
首页 > 其他好文 > 详细

动态内存与智能指针

时间:2017-10-07 16:26:45      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:out   需要   指针   内存   logs   转移   控制   har   mes   

  全局对象在程序启动时分配内存,在程序结束时销毁。对于局部自动变量,我们进入其定义所在的程序块时被创建,离开时被销毁。局部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 */

 

动态内存与智能指针

标签:out   需要   指针   内存   logs   转移   控制   har   mes   

原文地址:http://www.cnblogs.com/wsw-seu/p/7634765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!