码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 内存泄漏总结

时间:2016-04-30 01:01:08      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:

  关于C++全局变量的释放问题,一直比较模糊,今天做了一个测试:

  使用的内存泄漏检测工具是:Visual Leak Detector 可以直接去官网下载

一、关于全局变量的指针类型,程序在退出时,动态创建的对象还存在于内存中,导致内存泄漏;

 1 #include <stdlib.h>
 2 
 3 #include "vld.h"    // 内存泄漏检测工具
 4 #pragma comment(lib,"vld.lib")
 5 
 6 using namespace std;
 7 
 8 int num = 10;
 9 int* pages = new int(10);
10 const int index = 10;
11 static int* pcount = new int(34);
12 static int age = 26;
13 
14 int main()
15 {
16     delete pages;    // 对于全局的指针类型,如果不显示的进行释放,则会存在内存泄漏
17     pages = NULL;
18 
19     delete pcount;
20     pcount = NULL;
21 
22     int b = 12;
23     return 0;
24 }

二、在函数内部通过new分配的成员,需要考虑是否需要释放对象;和是否定义指针没有关系;

技术分享
 1 #include <stdio.h>
 2 #include <iostream>
 3 
 4 #include "vld.h"    // 内存泄漏检测工具
 5 #pragma comment(lib,"vld.lib")
 6 
 7 using namespace std;
 8 
 9 class Widget
10 {
11 public:
12     Widget()
13         : m_pnYear(NULL)
14     {
15     }
16 
17     ~Widget()
18     {
19         if (m_pnYear)
20         {
21             std::cout << "析构Widget" << endl;
22             delete m_pnYear;
23             m_pnYear = NULL;
24         }
25     }
26 
27     void SetYear(int* pYear)
28     {
29         m_pnYear = pYear;
30     }
31 
32 private:
33     int* m_pnYear; 
34 };
35 
36 int main()
37 {
38     // pi1 是通过new生成的,如果后面不进行删除,则会内存泄漏
39     int* pi1 = new int(44);    
40     delete pi1;
41     pi1 = NULL;
42 
43     // 此时对象是建立在栈上的,所以在函数退出时,会自动调用wiget的析构函数
44     // 从而pi2是由widget对象的来管理的,不需要再这里显示的调用,
45     Widget widget; 
46     int* pi2 = new int(32);    // 不过在析构后成为野指针
47     widget.SetYear(pi2);
48 
49     // 这种类型的出事化,类似上面定义的pi1,必须显示delete
50     Widget* pWid = new Widget();
51     delete pWid;
52     pWid = NULL;
53 
54     int b = 12;
55     return 0;
56 }
View Code

 

C++ 内存泄漏总结

标签:

原文地址:http://www.cnblogs.com/iceriver-dwanlight/p/5447836.html

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