最近为了准备面试,开始看《剑指Offer》这本书。的确是受到了很多启发,不管是面试技巧还是算法上。在这里记录下受到的启发和意识到的错误。
这里记录下书中提到的第一道题,我自己编写的程序,如果有什么不对的地方,各位不吝赐教。
题目是:请为CMyString该类型(有成员变量char* p_data)添加赋值运算符函数。(如果想知道完整的题目,请自行百度)。我贴出自己的代码,然后就我编写中遇到的困难做一说明。
代码如下:
CMyString.h文件
class CMyString
{
public:
CMyString();
CMyString(const CMyString& str);
virtual ~CMyString();
CMyString& operator=(const CMyString& old);
public:
char* p_data;
};
MyString.cpp文件
#include "MyString.h"
CMyString::CMyString()
{
p_data = new char[10];
}
CMyString::CMyString(const CMyString& str){
this->p_data = str.p_data;
}
CMyString::~CMyString()
{
if(p_data != NULL){
delete[] p_data;
p_data = NULL;
}else{
cout << "~~~~~ " << endl;
}
}
CMyString& CMyString::operator=(const CMyString& old){
if (this == &old)
{
return *this;
}
delete []p_data;
p_data = NULL;
p_data = new char[strlen(old.p_data)+1];
strcpy(p_data, old.p_data);
return *this;
/*if(this != &old){
CMyString strTemp(old);
char* tmp = strTemp.p_data;
strTemp.p_data = p_data;
p_data = tmp;
}
return *this;*/
}
main
void main(){
CMyString mystring1, mystring2;
//mystring1.p_data = "wang";
//mystring2.p_data = "zhou";
strcpy(mystring1.p_data, "wang");
strcpy(mystring2.p_data, "zhou");
mystring1 = mystring2;
cout << mystring1.p_data << " " << mystring2.p_data << endl;
}
一开始的时候程序一直运行不了,因为用的是main函数里注释掉的那两行赋值语句,后来用了strcpy函数就可以运行了。因为如果用赋值,把p_data指向字符常量,那么重载赋值操作的时候,先delete[] p_data就会有内存错误。而且,由于在构造函数里给p_data分配了空间,并没有给它赋值,在析构的时候也不会释放内存,会导致内存泄露。
而strcpy函数,把构造函数分配的空间赋值了“wang”,这样在重载赋值操作符的delete语句便不再有问题。因此可以正常运行。
c++的内存真是一门学问,借此记录下曾经犯过的错误,希望以后不会再犯。