operator 和 析构函数的 调用问题?

qiucp 2008-04-01 05:25:49

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

#define PNULL 0

class My_String
{
public:
void Output(void);
My_String(void);
My_String(char *str);
~My_String(void);
My_String operator = (const My_String &str);
private:
char *m_pstr;
char m_strlen;
};

My_String::My_String(void)
{
m_strlen = 1;
m_pstr = new char[m_strlen];
assert(m_pstr != PNULL);
*m_pstr = '\0';
}

My_String::My_String(char *str)
{
m_strlen = strlen(str) + 1;
m_pstr = new char[m_strlen];
assert(m_pstr != PNULL);
strcpy(m_pstr, str);
}

My_String::~My_String(void)
{
delete m_pstr;
}

void My_String::Output(void)
{
cout<<"the string is:"<<endl;
cout<<m_pstr<<endl;
return;
}

My_String My_String::operator = (const My_String &str)
{
if (this == &str)
return *this;
m_strlen = str.m_strlen;
//free the old spaces
if (m_pstr != PNULL)
delete m_pstr;
m_pstr = new char[m_strlen];
assert(m_pstr != PNULL);
strcpy(m_pstr, str.m_pstr);
return *this;
}

int main()
{
My_String str("aldjalfjgsfsdfasdfadfadf");

My_String st;

str.Output();

st = str; //为什么程序在运行完这句之后就将st析构掉了啊???????

st.Output();

return 1;
}


希望高手指教。^_^
...全文
922 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonelykkk 2008-08-30
  • 打赏
  • 举报
回复
我晕,难道此处有 LJ通信的人? 怪不得我觉得好眼熟!!!
lonelykkk 2008-08-30
  • 打赏
  • 举报
回复
上面一句是给 15楼的。
此外,因为strlen不会计算 ‘/0’,所以要+1, 这个市给 18楼的。
lonelykkk 2008-08-30
  • 打赏
  • 举报
回复
....你什么都不懂,请不要误导别人。
无病呻吟2 2008-04-08
  • 打赏
  • 举报
回复
你应该看
effective c++
条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符

没有定义拷贝构造函数,那么系统会自动的使用默认拷贝构造函数,这时它会很笨的,直接一个成员一个成员的赋值,所以两个指针指向同一个地方,其中一个的生存周期过了,另外一个的生存周期也结束了,所以出现楼主的问题!!
liutaoking 2008-04-07
  • 打赏
  • 举报
回复
佩服paidfighting,问题好解决,原因到很难找!
boxxer 2008-04-07
  • 打赏
  • 举报
回复
22楼的是什么意思啊?
疯魔症 2008-04-06
  • 打赏
  • 举报
回复
学习下
mengde007 2008-04-05
  • 打赏
  • 举报
回复
同志们的讨论很好啊
Cpp权哥 2008-04-05
  • 打赏
  • 举报
回复
已经结贴了,还是想说两名。在涉及指针成员并使用动态内存的类中,一般要重载operator=和拷贝构造函数。
珠琪 2008-04-05
  • 打赏
  • 举报
回复
Operator = 与拷贝构造函数要同时创建
hoosean 2008-04-04
  • 打赏
  • 举报
回复
路过看看,我看了之后,有些东西理解还不是很深啊,我自己还要努力学习啊!!
red_berries 2008-04-03
  • 打赏
  • 举报
回复
默认的copy构造函数是浅复制造成的...,自己重载一下就好了,不返回 & 比较好点
dnaiel_zeng 2008-04-03
  • 打赏
  • 举报
回复
很热烈嘛,在CSDN里总可以学到些分析很透彻的问题
好地方啊!!!!
ketet 2008-04-03
  • 打赏
  • 举报
回复
发现你的代码很多地方都不规范,比如,没有复制操作的成员函数应该声明为const,避免修改类属性。
lkldiy 2008-04-03
  • 打赏
  • 举报
回复
return 1
jeff_nie 2008-04-02
  • 打赏
  • 举报
回复
路过看看.
Ariel_chenge 2008-04-02
  • 打赏
  • 举报
回复

需要用拷贝构造函数,函数返回临时变量后自动析构,另外,两个构造函数定义不一致

My_String::My_String(void)
{
m_strlen = 1;
m_pstr = new char[m_strlen + 1];
assert(m_pstr != PNULL);
*m_pstr = '\0';
}

My_String::My_String(char *str)
{
m_strlen = strlen(str) + 1;
m_pstr = new char[m_strlen];
assert(m_pstr != PNULL);
strcpy(m_pstr, str);
}

其中,无参的构造函数m_strlen = 1而m_pstr长度是2,有参的定义m_strlen为字符串长加1,m_pstr的长定义成了m_strlen
libing8384 2008-04-02
  • 打赏
  • 举报
回复
6楼正解。由于返回类型为My_String,而非引用,所以函数结束后会生成一个临时变量,而这个变量是用*this为参数,调用类的copy ctor构造的。由于没有定义copy ctor,编译器会合成一个,其默认行为是使临时变量的m_pstr指向*this的m_pstr。当这个临时变量超出其作用域而被析构的时候,原来的对象中的字符串也就被delete掉了。
hunterjk 2008-04-02
  • 打赏
  • 举报
回复
受教,关于函数析构有了新的认识。
physics1988 2008-04-02
  • 打赏
  • 举报
回复
同意楼上的看法。析构函数里面delete m_pstr只把释放了指针指向的内存地址,应该是delete[] m_pstr
还有怎么主函数里面return 1;?
返回一个非零值是表示程序错误喔,还有
void My_String::Output(void)
{
cout<<"the string is:"<<endl;
cout<<m_pstr<<endl;
return;
}

为什么声明为没返回值的函数还要写return?
加载更多回复(14)

64,849

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧