为什么这个程序在析构的时候出现Debug Assertion Failed?我的析构函数有问题吗?

poppopa 2014-09-17 09:31:42

#include <iostream>
using namespace std;

class MyString
{
friend ostream& operator<<(ostream& os, MyString ms);
private:
char *str;
public:
MyString(string s){str = new char[s.length()+1]; strcpy(str,s.c_str());};
~MyString(){delete []str;};
void prnt();
};

void MyString::prnt()
{
cout << str << endl;
}

ostream& operator<<(ostream& os, MyString ms)
{
os << ms.str << endl;
return os;
}

int main()
{
string s = "abcd xyz";
MyString s1(s);
string s2 = "hello";
cout << "s1---> " << s1 << endl;
cout << "s2---> " << s2 << endl;
getchar();
return 0;
}

...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2014-09-17
  • 打赏
  • 举报
回复
引用 5 楼 edaeda3 的回复:
[quote=引用 2 楼 brookmill 的回复:] <<里面的ms是按值传递的,编译器要调用拷贝构造函数生成一个临时的MyString变量,这个临时变量析构的时候就把str给delete了,然后main里面的s1析构的时候就又delete了一次。 这种带有new指针的类,应该自己写拷贝构造函数。如果让编译器默认生成拷贝构造函数,它只会浅拷贝
关于您所说的“这个临时变量析构的时候就把str给delete了”,我不理解。临时变量创建的时候不是应该自己创建一个str吗?它析构的为什么是实参的str,而不是这个临时变量自己的str呢?[/quote] 创建临时变量的时候,调用的是拷贝构造函数,而不是你最初代码里面的那个构造函数。 如果像3楼那样自己写了拷贝构造函数,那就没问题,他会自己创建一个str。但是如果自己没写,编译器默认生成的拷贝构造函数,他就不会去自己创建str,它只会拷贝原来的str
poppopa 2014-09-17
  • 打赏
  • 举报
回复
哦 刚才看了下书,看到了浅拷贝的内容,谢谢brookmill
poppopa 2014-09-17
  • 打赏
  • 举报
回复
引用 2 楼 brookmill 的回复:
<<里面的ms是按值传递的,编译器要调用拷贝构造函数生成一个临时的MyString变量,这个临时变量析构的时候就把str给delete了,然后main里面的s1析构的时候就又delete了一次。 这种带有new指针的类,应该自己写拷贝构造函数。如果让编译器默认生成拷贝构造函数,它只会浅拷贝
关于您所说的“这个临时变量析构的时候就把str给delete了”,我不理解。临时变量创建的时候不是应该自己创建一个str吗?它析构的为什么是实参的str,而不是这个临时变量自己的str呢?
derekrose 2014-09-17
  • 打赏
  • 举报
回复
首先有个很严重的问题 没有\0
brookmill 2014-09-17
  • 打赏
  • 举报
回复
MyString(const MyString &ms) { str = new char[strlen(ms.str)+1]; strcpy(str,ms.str);}; 赋值运算符也要自己写,用个strcpy就好。如果让编译器默认生成,也是会出问题的。 还有两个习惯问题: c++传递类参数的时候,尽量用const MyString & 类的成员函数尽量加const,比如void prnt() const;
brookmill 2014-09-17
  • 打赏
  • 举报
回复
<<里面的ms是按值传递的,编译器要调用拷贝构造函数生成一个临时的MyString变量,这个临时变量析构的时候就把str给delete了,然后main里面的s1析构的时候就又delete了一次。 这种带有new指针的类,应该自己写拷贝构造函数。如果让编译器默认生成拷贝构造函数,它只会浅拷贝
brookmill 2014-09-17
  • 打赏
  • 举报
回复
两个解决办法: ostream& operator<<(ostream& os, MyString ms) 改成 const MyString &ms 或者自己写一个拷贝构造函数

64,282

社区成员

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

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