关于内存泄露的问题(附上代码)

王者林风音乐坊(欢少) 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
汇率兑换计算器

类似问答
  • 关于存款的问题
    • 2024-12-01 02:52:16
    • 提问者: 未知
    其实存定期不建议一笔金额那么大,20w,分4张存单更好,万一需要用钱,而又用不了20w那么多。那你就可以保着一部分定期利息了。
  • 高考试题答案泄露
    • 2024-12-01 02:42:59
    • 提问者: 未知
    您好,对于您提出的问题,我的解答是, 根据《中华人民共和国刑法》第二百八十四条非法使用**、窃照专用器材,造成严重后果的,处二年以下**、拘役或者管制。第二百八十四条 在法律规定的**考试中,组织作弊的,处三年以下**或者拘役,并处或者单处罚金;情节严重的,处三年以上七年以下**,并处罚金。为他人实施前款犯罪提供**材或者其他帮助的,依照前款的规定处罚。为实施**行为,向他人非法出售或者提供第一...
  • j**a防止内存的泄漏什么意思,内存还能泄露?
    • 2024-12-01 10:46:21
    • 提问者: 未知
    内存的泄漏指的是内存的一块区域一直没有被释放,当这样的区域越来越多时,系统就会崩溃。
  • 关于英雄联盟错误代码738197853无法更新的问题
    • 2024-12-01 05:44:25
    • 提问者: 未知
    11.找到英雄联盟的安装目录 22.双击打开文件夹tcls 33.双击文件client程序。自己更新即可 end
  • c++代码中关于0x7fffffff的问题
    • 2024-12-01 22:46:55
    • 提问者: 未知
    可以算 0x7fffffff 多每个十**bit,因此8位16进制是4个字节,刚好是一个int整f的二进制码为 11117的二进制码为 0111这样一来,整个整数 0x7fffffff 的二进制表示就是除了首位是 0,其余都是1就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)用 int_max 常量可以替代这个值。
  • 我国上市公司会计报表附注披露存在哪些问题?
    • 2024-12-01 13:45:11
    • 提问者: 未知
    信息披露不完整,披露存在选择性。
  • 内存代码
    • 2024-12-01 01:28:59
    • 提问者: 未知
    你这是杀毒后遗症。第一种方法: 可以先用超级兔子清理系统注册表。如不行下载优化**(要注册后才行,在百度上找一个注册码) 用优化**进入安全模式自动优化系统。第二种方法: 可以把系统盘放在光驱里并用光盘启动,在安装界面上,选择修复系统,
  • 关于存款理财的问题
    • 2024-12-01 07:02:23
    • 提问者: 未知
    需要另存,到期后就按照活期0.36%计息了,如果不用可以去转存成定期,三个月半年一年等等,如果长期不用,可以存到三年的,建议你把钱先存成定期三个月,自动转存的,如果三个月之内发行国债就可以取出来买国债,不到三个月按活期计算利息,如果三个月之后发行国债,起码还能有三个月的定期利息
  • 关于****泄露的问题?
    • 2024-12-01 16:45:33
    • 提问者: 未知
    这个没事,只要你保护好自己的密码不就行了。不过一般分期付款最好保留小票,遇到什么问题的话,可以凭小票退货,你退款的话也要拿小票才行。
  • 关于电脑超频和内存扩充的问题,请帮忙……
    • 2024-12-01 00:49:49
    • 提问者: 未知
    先提醒一下,如果超频失败是要清cmos的,如果不知道可以去查查。667不知发热量如何,如果本身就很烫,超频后你的散热器肯定不行,你可以先拆开机箱摸摸。不过说实话,现在低功耗的u超频都得换散热,你的那么旧,不一定能超,况且667到1000超频幅度可不小。建议在软件里设置,用软件在系统里超,如clockgen.但不知道支持不支持你的u。内存没问题,只不过不是双通道。我的建议是,花2500攒一个。以你的...
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。