【求助】实现自己的String类,operator+出现问题

_浮生_ 2017-10-17 10:28:00
实现一个自己的String类,可是实现operator+有问题,具体代码如下:

#include <iostream>
#include <string>

using namespace std;

class MyString
{
private:
int len;
char* buffer;
public:
MyString() :len(1), buffer(new char[1])
{
buffer[0] = '\0';
}
MyString(const MyString&);
MyString(const char*);
MyString& operator=(const MyString&);
MyString& operator=(const char*);
MyString& operator=(MyString&&);
~MyString();

int size() const;
char* data() const;

MyString& operator+=(const MyString&);
friend MyString operator+(const MyString&, const MyString&);
operator char*();
};

MyString::MyString(const MyString& str)
{
cout << "copy constructor" << endl;
len = str.size() + 1;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, str.data());
}

MyString::MyString(const char* chStr)
{
int i = 0;
while (chStr[i++] != 0);
len = i;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, chStr);
}

MyString& MyString::operator=(const MyString& str)
{
len = str.size() + 1;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, str.data());

return *this;
}

MyString& MyString::operator=(MyString&& str)
{
len = str.size() + 1;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, str.data());

str.len = 1;
if (buffer != NULL)
delete[] str.buffer;
str.buffer = new char[1];
str.buffer[0] = '\0';

return *this;
}

MyString& MyString::operator=(const char* chStr)
{
int i = 0;
while (chStr[i++] != 0);
len = i;
if (buffer != NULL)
delete[] buffer;
buffer = new char[len];
strcpy(buffer, chStr);

return *this;
}

MyString::~MyString()
{
if (buffer != NULL)
delete[] buffer;

cout << "destructor" << endl;
}

int MyString::size() const
{
return len - 1;
}

char* MyString::data() const
{
return buffer;
}

MyString::operator char*()
{
cout << "operator char*" << endl;
return buffer;
}

MyString operator+(const MyString& str1, const MyString& str2)
{
cout << "operator + begin" << endl;

int n1, n2;
char * S;
n1 = strlen(str1.buffer);
n2 = strlen(str2.buffer);
S = new char[n2 + n1 + 1];
strcpy(S, str1.buffer);
strcat(S, str2.buffer);
MyString S1(S);
cout << S1 << endl;
cout << "operator + end" << endl;

return S1;
}

int main()
{
MyString s1("123");
MyString s2 = "456";

cout << s1+s2 << endl;

return 0;
}

运行结果如下:

根据运行结果,operator+中在return之前应该都是没有问题的,应该是return结果复制到临时变量时出了问题,可是这里面到底是怎么实现的不太懂,望大牛们多多指导,是哪个地方写的有问题,谢谢!
...全文
296 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
_浮生_ 2017-10-17
  • 打赏
  • 举报
回复
引用 4 楼 hdt 的回复:
几个构造函数里 MyString(const MyString&); MyString(const char*); 因为他是构造函数,代表它在对象初始化时候调用,也就是说对象是从无到有的情况下,而那个时候的buffer值,是不需要delete的,而且由于编译器对于指针类型的字段有可能赋予随机值,而不是NULL,所以delete出错。
删除delete之后,工作正常了,谢谢!
_浮生_ 2017-10-17
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 《C++编程思想》
谢谢老师的建议!
真相重于对错 2017-10-17
  • 打赏
  • 举报
回复
几个构造函数里 MyString(const MyString&); MyString(const char*); 因为他是构造函数,代表它在对象初始化时候调用,也就是说对象是从无到有的情况下,而那个时候的buffer值,是不需要delete的,而且由于编译器对于指针类型的字段有可能赋予随机值,而不是NULL,所以delete出错。
赵4老师 2017-10-17
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 《C++编程思想》
大尾巴猫 2017-10-17
  • 打赏
  • 举报
回复
拷贝构造和赋值函数没有进行自我检查,要检查参数的str地址和this指针是否一致。 既然实现了赋值的移动语义,构造也要。 赋值的移动语义函数实现不正确,移动,就应该直接把缓冲区拿过来,同时把参数的缓冲区设置null,而不是new了再strcpy
qq_36421023 2017-10-17
  • 打赏
  • 举报
回复
去掉构造函数里面的 if (buffer != NULL) delete[] buffer;

64,637

社区成员

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

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