首页
社区
课程
招聘
小菜求助C++的问题
发表于: 2010-6-17 16:39 3736

小菜求助C++的问题

2010-6-17 16:39
3736
[CODE]
#include<iostream>
#include <cstring>
#include <string>
using namespace std;
class DMA
{
private:
	    enum{max=20};
		char  *mString;
public:
	DMA(char *s="none"); 
	~DMA();
	DMA(const DMA & addString);
	DMA & operator=(const DMA & addString);
    void operator+( char * catStr);
	friend std::ostream & operator<<(std::ostream & os,const DMA & rs);
};
DMA::DMA(char *s)
{	
	int len=strlen(s);
	mString=new char[len+1];
	strcpy(mString,s);
}
DMA::~DMA()
{
	delete[] mString;
}
DMA::DMA(const DMA & addString)
{
		int len=strlen(addString.mString);
		mString=new char[len+1];
		strcpy(mString,addString.mString);
}
DMA & DMA::operator=(const DMA & addString)
{
		if (this==&addString)
			return *this;
		delete[]mString;
		int len=strlen(addString.mString);
		mString=new char[len+1];
		strcpy(mString,addString.mString);
		return *this;
}
void DMA::operator+( char * catStr)
{
		int Lstr=strlen(catStr);
		int LMstr=strlen(this->mString);
		mString=new char[(Lstr+LMstr)+2];
		strcat(this->mString,catStr);
}
ostream & operator<<(ostream & os,const DMA &rs)
{
	os<<rs.mString<<endl;
	return os;
} 
int main()
{
	DMA sOne("woshi");
	 sOne+"Pogramer";
    	cout<<sOne ;
	return 0;
}



编译出来。会出现屯屯屯屯的问题。不知道那里数组越界了还是怎么了。大家帮一下

[/CODE]

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 780
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
1     void DMA::operator+( char * catStr)
2     {
3           int Lstr=strlen(catStr);
4           int LMstr=strlen(this->mString);
5           mString=new char[(Lstr+LMstr)+2];
6           strcat(this->mString,catStr);
7      }

5行的new使得mString指向了新的未初始化的内存,原有内容丢失了
2010-6-17 16:59
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mString=new char[(Lstr+LMstr)+2];
           strcat(this->mString,catStr);

第一条语句mString指向了一块未初始化的内存空间,如果内存够用的话windows下应该是0xCC。
第二条语句会首先找到mString的字符串结尾(即0x00),等找到0x00后,系统会将catStr字符串拷贝到0x00开始的内存。寻找mString结束时,一般会出现越界的情况(因为未初始化的内存中很有可能不存在0X00)。假设后面的是系统保护内存,则会程序出错退出。

总结:
没有死机已经是万幸了。建议给个初始值,比如memset(mString, 0, Lstr+LMstr+2);
2010-6-17 18:36
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
一点小建议,

搂住每次在给mString = new [] 新的空间/*的时候*/之前,记得要调用delete mString,

要不然会有内存泄露, 习惯会对工作有很大影响,尤其是刚要工作的时候,

还有成员指针变量建议用名  m_pString
2010-6-21 15:04
0
雪    币: 391
活跃值: (717)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=levizhou;826443]一点小建议,

搂住每次在给mString = new [] 新的空间的时候,记得要调用delete mString,

要不然会有内存泄露, 习惯会对工作有很大影响,尤其是刚要工作的时候,

还有成员指针变量建议用名  m_pString[/QUOTE]
为什么要delete mString?你是不是想表达mString= NULL?防止野指针吗?
2010-6-21 15:57
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
在DMA的每一个构造函数中都为mString "new" 了相应的空间,
如果在下一次给mString "new" 内存的时候, 之前分配的没有释放,便会造成内存泄露(如果有其他指针指向该段内存的话,还是可以释放的)

当然正常delete之后,都建议调用mString = NULL;
以避免再次调用 delete mString; 造成double free 访问违例。
2010-6-21 16:06
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习~~~~~~~~
2010-6-21 16:53
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
友元函数那里,不能访问私有成员。
还有一个<<重载的问题,是我编译器的问题。
还有2楼是对的。
2010-6-21 18:18
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
代码长眼看花了
2010-6-21 18:25
0
游客
登录 | 注册 方可回帖
返回
//