永发信息网

一百分求delete简单的讲解 一个小地方不懂

答案:3  悬赏:30  手机版
解决时间 2021-07-17 12:30
  • 提问者网友:自食苦果
  • 2021-07-16 22:49

很简单的两个类

请注意那个delete 我把他注释掉就可以运行? 为什么?

那要怎么释放啊?

#include<iostream.h>
#include<string.h>

class dress
{
public:
dress(char *w)
{
p=new char[strlen(w)+1];
p=w;
}
dress operator =(dress &w)
{

//delete []p;
p=new char[strlen(w.p)+1];
p=w.p;
return *this;
}
void display()
{
cout<<*p<<endl;
}
~dress()
{
// delete []p;
}
private:
char *p;
};

void main()
{

dress a("777111");
a.display();
dress b("2222222");
b.display();
a=b;
a.display();
}

最佳答案
  • 五星知识达人网友:鱼忧
  • 2021-07-17 00:25
要写一个拷贝构造函数,另外你new出来怎么又直接p=w了?这样先前new出来的空间有什么用?而且还会造成析构时delete两次,肯定要出错,给你改好了,不过代码依旧隐患重重:

#include<iostream.h>
#include<string.h>

class dress
{
public:
dress(char *w)
{
p=new char[strlen(w)+1];
strcpy( p, w );
}

dress( const dress& d )
:p(0)
{
if ( p ) delete [] p;
p=new char[strlen(d.p)+1];
strcpy( p, d.p );
}


dress operator =(dress &w)
{
delete []p;
p=new char[strlen(w.p)+1];
strcpy( p , w.p );
return *this;
}

void display()
{
cout<<*p<<endl;
}

~dress()
{
delete []p;
}
private:
char *p;
};

void main()
{

dress a("777111");
a.display();
dress b("2222222");
b.display();
a=b;
a.display();
}
全部回答
  • 1楼网友:duile
  • 2021-07-17 01:57
不应该用p=w;,前面new出来的空间丢失了,造成内存遗漏,并且delete[]变得不是释放上一句new出来的内存,而是去释放w的内存了。你可以考虑用strcpy把w的内容复制进来。
  • 2楼网友:蓝房子
  • 2021-07-17 00:45
p=w;这种赋值是有问题的,释放肯定有问题,
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯