C++内存泄露问题

jiaqi71 2017-09-20 09:45:36
//string2.h
#ifndef STRING2_H_
#define STRING2_H_
#include <iostream>
#pragma once
class string2
{
char * str;
int len;
static const int CINLIM=80;
public:
string2();
string2(const char *s);
string2(const string2 &);
~string2();

string2 & operator=(const string2 &);
string2 & operator=(const char *);

friend string2 operator+(const char *,const string2 & a);
friend string2 operator+(const string2 &s,const string2 & a);

friend std::ostream & operator<<(std::ostream & os,const string2 & s);
friend std::istream & operator>>(std::istream & is,string2 & s);
};
#endif

#include "string2.h"
#include <cstring>
string2::string2()
{
len=1;
str=new char[len+1];
str[1]='c';
}

string2::string2(const char *s)
{
len=strlen(s);
str=new char[len+1];
strcpy(str,s);
}

string2::string2(const string2 & s)
{
len=s.len;
str=new char[len+1];
strcpy(str,s.str);
}

string2::~string2()
{
delete [] str;
}


string2 operator+(const char *s,const string2 & a)
{
string2 sum;
sum.str=new char [strlen(s)+1];//这里面有问题,如果我直接写sum=new char[strlen(s)+1],编译能通过,而换成程序中写的编译就通不过了
strcpy(sum.str,s);
strcat(sum.str,a.str);
sum.len=strlen(sum.str);
return sum;
}
string2 operator+(const string2 & s,const string2 & a)//前面的析构函数和构造函数几乎和书上的一样都没有改动,后面的几个重载函数都单独试验过了并没有问题
{
string2 sum;
sum.str=new char [strlen(s.str)+1];
strcpy(sum.str,s.str);
strcat(sum.str,a.str);
return sum;
}
string2 & string2::operator=(const string2 & s)
{
if(this==&s)
return *this;
delete [] str;
len=s.len;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return *this;
}

string2 & string2::operator=(const char *s)
{
delete [] str;
len=strlen(s);
str=new char[len+1];
strcpy(str,s);
return *this;
}
std::ostream & operator<<(std::ostream & os,const string2 &s)
{
os<<s.str;
return os;
}

std::istream & operator>>(std::istream & is, string2 &s)
{
char temp[string2::CINLIM+1];
is.get(temp,string2::CINLIM);
if(is)
s=temp;
while(is&&is.get()!='\n')
continue;
return is;
}

//主函数
#include <iostream>
using namespace std;
#include "string2.h"
int main()
{
string2 s1(" and I am a C++ student.");
string2 s2="Please enter your name: ";
string2 s3;
cout<<s2;
cin>>s3;
s2="My name is "+s3;
s2=s2+s3;
return 0;
}


函数多次试验,发现是重载+出了问题,求解答;顺便求问,按F10进行逐步执行,出现问题后按F11,进入,然后里面的代码都看不懂怎么办,需要找一些什么书籍来看?谢谢
...全文
284 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaqi71 2017-09-21
  • 打赏
  • 举报
回复
谢谢,这两个问题之前忽略了
棉猴 2017-09-21
  • 打赏
  • 举报
回复
1.问题分析 我觉得主要原因在main()函数的这一行代码中
s2=s2+s3;
该行代码调用了类string2的重载+操作符,而该操作符的定义为
string2 operator+(const string2 & s,const string2 & a)//前面的析构函数和构造函数几乎和书上的一样都没有改动,后面的几个重载函数都单独试验过了并没有问题
{
    string2 sum;
    sum.str=new char [strlen(s.str)+1];
    strcpy(sum.str,s.str);
    strcat(sum.str,a.str);
    return sum;
}
重载+操作符函数中,没有为sum的len赋值,此时len的值仍然是1,所以在函数返回时调用string2类的拷贝构造函数
string2::string2(const string2 & s)
{
	len = s.len;
	str = new char[len + 1];
	strcpy_s(str, len + 1,s.str);
}
时,str的内存大小为len+1,len的值是1,所以str的大小仅为2,所以在调用strcpy进行拷贝时会报错。 2 问题解决 在重载+操作符中添加对sum.len的赋值
string2 operator+(const string2 & s, const string2 & a)//前面的析构函数和构造函数几乎和书上的一样都没有改动,后面的几个重载函数都单独试验过了并没有问题
{
	string2 sum;
	sum.str = new char[strlen(s.str) + a.len+ 1];
	strcpy_s(sum.str, strlen(s.str) + 1,s.str);
	strcat_s(sum.str, strlen(s.str) + a.len+1, a.str);
	sum.len = strlen(sum.str);//添加对sum.len的赋值
	return sum;
}
3 相关资料 C++中运算符的重载 http://blog.csdn.net/hou09tian/article/details/78024780 C++中拷贝构造函数与拷贝赋值操作符 http://blog.csdn.net/hou09tian/article/details/77483175
paschen 版主 2017-09-20
  • 打赏
  • 举报
回复
代码没帮你细看,你可以先注释掉一些无关的代码,直到找出是哪里泄漏,另外建议operator+返回值用引用,减小开销

64,642

社区成员

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

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