string类
浅拷贝
问题:只是一个简单的赋值,使得指针指向同一块内存块,当销毁时会内存被多次释放,就会出现问题。
浅拷贝的优点:实现了一种共享机制,如果在使用过程中仅仅只是访问,那么开销大大减少,节省了空间。而如果修改量比较大,那么就需要考虑进行深拷贝的实现了。
深拷贝
每个对象拥有自己独立的资源,实现了资源私有,在释放时就不会出现问题。
问题:资源占用率太大,而如果使用只是为了访问,那么这种深拷贝机制就大大浪费了空间资源。
写实拷贝
- 写之前,浅拷贝,实现资源共享
- 写时,深拷贝
当引用计数大于1时,实现深拷贝(原内存块的引用计数-1)
当引用计数等于1时,就直接修改
内存释放:
当最后一个对象销毁时(通过引用计数器来判断),才释放内存。
引用计数器:当申请内存时,多申请4个字节的内存,在头部来存放当前内存的引用计数。
class String
{
public:
String(char *p)
{
ptr=new char(strlen(p)+5);
ptr+=4;
strcpy(ptr,p);
}
String (const String& rhs)
{
ptr=rhs.ptr;
getRef()++;
}
~String()
{
--getRef();
if(getRef()==0)
{
delete[] (ptr-4);
}
ptr=NULL;
}
String operator=(const String& rhs)
{
if(this!=&rhs)
{
getRef()--;
if(getRef()==0)
{
delete[] (ptr-4);
}
ptr=NULL;
ptr=rhs.ptr;
getRef()++;
}
return *this;
}
char& operator[](int index)
{
if(getRef()>0)
{
getRef()--;
char *newptr=new char[strlen(ptr)+5];
newptr+=4;
strcpy(newptr,ptr);
ptr=newptr;
getRef()=1;
}
return ptr[index];
}
private:
char *ptr;
int& getRef()
{
return *(int*)(ptr-4);
}
};