/*
构造函数,析构函数和赋值操作符
几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。
构造函数控制对象生成时的基本操作,并保证对象被初始化;析构函数摧毁一个对象并保证它被彻底清除;赋值操作符则给对象一个新的值。
在这些函数上出错就会给整个类带来无尽的负面影响,所以一定要保证其正确性。
本章我将指导如何用这些函数来搭建一个结构良好的类的主干。
构造函数,析构函数和赋值操作符
几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。
构造函数控制对象生成时的基本操作,并保证对象被初始化;析构函数摧毁一个对象并保证它被彻底清除;赋值操作符则给对象一个新的值。
在这些函数上出错就会给整个类带来无尽的负面影响,所以一定要保证其正确性。
本章我将指导如何用这些函数来搭建一个结构良好的类的主干。
*/
/*
条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
拷贝的时候如果没有自定义的拷贝函数,而调用默认的拷贝函数,如果类中有指针,只是对指针进行浅复制。
赋值操作符也一样,使用默认的赋值操作符是浅复制,这两种都会造成多个指针指向一片内存。多个指针指向同一片内存会怎样呢 ?
1、多个对象调用各自的析构函数,多次释放同一片内存,这样造成程序奔溃。
2、如果原理的对象中的指针成员指向一片内存,但是复制的时候修改他指针的指向地址,那么原来的内存没有释放,造成内存的泄露。
*/
#include "vld.h"
#include "vldapi.h"
#include <iostream>
using namespace std;
class MyStr
{
private :
char* data;
public:
MyStr(char* str)
{
if(str!=NULL)
{
data = new char[strlen(str)+1];
strcpy(data,str);
}
else
{
data = new char[1];
data='\0';
}
}
~MyStr()
{
delete [] data;
data=NULL;
}
};
int main()
{
/* 情况一 <span style="font-family: Arial, Helvetica, sans-serif;">多次释放同一片内存,造成程序崩溃。</span>
//MyStr str =MyStr("测试");
//MyStr str_copy_by_operator = str; 多次释放同一片内存,造成程序崩溃。
*/
/*情况二 对象<span style="font-family: Arial, Helvetica, sans-serif;">持有的内存因为指针指向别的地址,所以原来的内存发生了泄露。</span>
MyStr* str2 =new MyStr("我持有内存");
MyStr* str3 = new MyStr("我开辟新内存");
str3 = str2;///str3持有的内存因为指针指向别的空间,所以原来的内存发生了泄露。
delete str2;
*/
}