标签:
关于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 }
标签:
原文地址:http://www.cnblogs.com/iceriver-dwanlight/p/5447836.html