俗語云:出來混,遲早是要還的。
下面是一道初級記憶體泄露題,程式員小懶兒顯式的用new動態分配了記憶體,卻忘記了用delete釋放。
請找出問題的所在,代碼如下:
#include <iostream>#include <cstring>using namespace std;class Student{int student_number;char* name;public:Student(int,char*);};Student::Student(int number,char* _name){student_number = number;name = new char[strlen(_name)+1];strcpy(name,_name);cout<<"student_number is "<<student_number<<endl;cout<<"name is "<<name<<endl;}int main(){Student *student = new Student(123,"linc");return 0;}
用gcc編譯運行:
D:\workspace\C++\memory_leak>gcc -o leak leak1.cpp -lstdc++leak1.cpp: 在函數‘int main()’中:leak1.cpp:29:43: 警告:不建議使用從字串常量到‘char*’的轉換 [-Wwrite-strings]D:\workspace\C++\memory_leak>leakstudent_number is 123name is linc
雖然有編譯器有警告,但是並不是提醒記憶體釋放的問題。
其實上面的代碼有兩處沒有釋放記憶體,一個是Student的成員變數name沒有在解構函式中釋放掉;另一個是main函數中student用完要delete回收。
完整代碼如下:
//linc//2013.3.7//C++ memory leak ,case 1#include <iostream>#include <cstring>using namespace std;class Student{int student_number;char* name;public:Student(int,char*);virtual ~Student();};Student::Student(int number,char* _name){student_number = number;name = new char[strlen(_name)+1];strcpy(name,_name);cout<<"student_number is "<<student_number<<endl;cout<<"name is "<<name<<endl;}//hereStudent::~Student(){delete name;}int main(){Student *student = new Student(123,"linc");delete student;return 0;}