能力值:
( 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指向了新的未初始化的内存,原有内容丢失了
|
能力值:
( 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);
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
一点小建议,
搂住每次在给mString = new [] 新的空间/*的时候*/之前,记得要调用delete mString,
要不然会有内存泄露, 习惯会对工作有很大影响,尤其是刚要工作的时候,
还有成员指针变量建议用名 m_pString
|
能力值:
( LV9,RANK:170 )
|
-
-
5 楼
[QUOTE=levizhou;826443]一点小建议,
搂住每次在给mString = new [] 新的空间的时候,记得要调用delete mString,
要不然会有内存泄露, 习惯会对工作有很大影响,尤其是刚要工作的时候,
还有成员指针变量建议用名 m_pString[/QUOTE]
为什么要delete mString?你是不是想表达mString= NULL?防止野指针吗?
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
在DMA的每一个构造函数中都为mString "new" 了相应的空间,
如果在下一次给mString "new" 内存的时候, 之前分配的没有释放,便会造成内存泄露(如果有其他指针指向该段内存的话,还是可以释放的)
当然正常delete之后,都建议调用mString = NULL;
以避免再次调用 delete mString; 造成double free 访问违例。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
学习~~~~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
友元函数那里,不能访问私有成员。
还有一个<<重载的问题,是我编译器的问题。
还有2楼是对的。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
代码长眼看花了
|
|
|