1.赋值函数浅拷贝问题:
先看看一段代码:
//base.h
#ifndef BASE_H
#define BASE_H
#include <stddef.h>
class Base
{
private:
ptr;
size_t len;
public:
Base(const char *val);
~Base();
void print() const;
void init(const char *val);
};
//base.cpp
#include <iostream>
#include <string.h>
using namespace std;
Base::Base(const char *val) : ptr(val),len(0)
{
init(val);
}
void Base::init(const char *val)
{
if(val)
{
len = strlen(val);
ptr = new char[len + 1];
bzero(ptr,len + 1);
strncpy(ptr,val,len);
}
}
Base::~Base()
{
if(ptr)
{
delete ptr;
ptr = NULL;
}
len = 0;
}
void Base::print() const
{
std::cout << "ptr: " << (ptr ? ptr :" ") << " len:" << len << std::endl;
}
int main()
{
Base base1("1");
base1.print();
//测试
{
Base base2("2");
base2.print();
base1 = base2;
}
base1.print();
return 0
}
看看上面代码,感觉跟自己想象的不一样,为什么?就是因为浅拷贝,导致base1对象中的ptr指向的那块内存永远的被丢失,而且,base1中的ptr指向了base2中的ptr(实际上已经被释放掉了),浅拷贝只适合系统内建类型的数据,为了防止这种情况,我们必须在赋值函数里面实现深拷贝(所谓深拷贝,就是拷贝对象的每一个字节),代码如下:
//base.h
Base& operator= (const Base& base);
inline const char* getPrt() const
{
return ptr;
}
//base.cpp
Base& operator= (const Base& base)
{
//如果是自己给自己赋值
if(&base == this)
{
return *this;
}
if(ptr)
{
delete ptr;
ptr = NULL;
len = 0;
}
init(base.getPtr());
return *this;
}
上面我们实现了赋值函数,运行一下,发现结果跟我们预想的一样!