Effective c++ : 构造函数,析构函数和赋值操作符

来源:互联网 发布:it教育网站 编辑:程序博客网 时间:2024/05/16 10:45
/*
构造函数,析构函数和赋值操作符

几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。
构造函数控制对象生成时的基本操作,并保证对象被初始化;析构函数摧毁一个对象并保证它被彻底清除;赋值操作符则给对象一个新的值。
在这些函数上出错就会给整个类带来无尽的负面影响,所以一定要保证其正确性。
本章我将指导如何用这些函数来搭建一个结构良好的类的主干。

*/


/*
条款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;
*/}



0 0
原创粉丝点击