关于内存泄露的问题(附上代码)
王者林风音乐坊(欢少)
2024-12-01 09:20:35
最佳回答
我帮你调好了, 加了一些注释, 以最好把这段代码考到vc6.0或是其他ide中,那样看起来方便些...#include <iostream.h>#include <string.h>#include <malloc.h>class hstring{ public: hstring():ch(**),length(0){cout<<"调用默认构造函数"<<endl;}; hstring( const char *chars ); hstring( const hstring &h ); friend hstring* operator +(const hstring& h1, const hstring& h2); ~hstring(); private: char *ch; int length;};//*************************************************************hstring::hstring(const char *chars){ int slen = strlen(chars); /*这里要加1, 以便把最后的'\0'字符串结束符复制进来,要不就溢出了*/ ch = new char[slen + 1]; /*既然有strcpy()这样的字符串拷贝函数,干嘛还要自己实现一套, 而且你这样忘记在最后加上字符串结尾符了,这要在用的时候肯定出问题 使用strcpy()函数会把最后的字符串结尾符一起拷贝进来的*/ strcpy(ch, chars); /*for(int i = 0 ; i < slen ; i++){ ch[i] = chars[i]; }*/ length = slen; cout<<"调用,初始化构造函数"<<endl;}//*************************************************************hstring::hstring(const hstring &h){ if(!ch) { /*你这程序真是c/c++混合编程呀,又是delete,又是free的^_^ new/delete, malloc/free最好要配对使用, 不要new的空间用 free去释放, 会出问题的*/ //free(ch); <-------- delete[] ch; ch = **; //这句别少了, 要不会产生野指针ch; } ch = new char[(h.length) + 1]; /*for(int i = 0; i < h.length; i++) ch[i] = h.ch[i];*/ strcpy(th**->ch, h.ch); length = h.length; cout<<"调用拷贝构造函数"<<endl;}//*************************************************************hstring::~hstring(){ if(ch!=**){ delete[] ch; ch = **; cout<<"析构ch"<<endl; } cout<<"调用析构函数"<<endl;}//***************************************************************hstring* operator +(const hstring& h1,const hstring& h2){ /*注意这里, 因为类中有指针变量, 所以不能声明成hstring h这样的一个局部变量, 因为这个局部变量在函数退出后就自动释放了, 如果类中只有非指针类型的变量,这样还是 可以的*/ hstring* h = new hstring(); h->length = h1.length + h2.length; h->ch = new char[h->length + 1]; //在子函数为h.ch申请了内存空间。 /*for(int i = 0; i<h1.length; i++) h.ch[i] = h1.ch[i]; for(i = 0; i<h2.length; i++) h.ch[i+h1.length] = h2.ch[i];*/ strcpy(h->ch, h1.ch); strcat(h->ch, h2.ch); // cout<<"h: "<<&h<<endl; return h; //返回了一个h的副本; }int main(){ hstring *h1 = new hstring("test1"); hstring *h2 = new hstring("test2"); cout<<"h1: "<<h1<<endl; cout<<"h2: "<<h2<<endl;//*h1 = *h1 + *h2; //在这个过程第二个h1的值,是不是泄露了? // h1指向了重载函数返回的副本,原先的那份是否已经泄露了? /*恩,应该是泄露了, 你可以这样做*/ hstring *h3 = **; h3 = *h1 + *h2; cout<<"after doing add h1: "<<h3<<endl; delete h1; delete h2; delete h3; h1 = **; h2 = **; return 0;} 20210311