异常对象的传递与复制构造函数

原创 2006年06月09日 17:56:00

今天搞了一个异常类,有一个char *desc 成员,是在对象创建时动态分配的.在外部的catch语句中

总是被释放掉.而另一个成员 int code 确是正确的.

后来经过研究发现,是缺少一个复制构造函数,加了红色部分就ok了.异常对象在throw语句到catch的

传递过程中要进行对象复制,像有指针成员这种情况,如果没有自己定义的复制构造函数,复制的对象

和throw语句的对象指针成员指向同一块内存.默认的复制过程完成后throw语句会调用析构函数会把

内存释放掉,这样catch语言中的异常对象指针成员就会出错了. 自定义一个复制构造函数如下就可以避免

这种情况.

/************************************************************************/
/* 异常定义                                                             */
/************************************************************************/

#ifndef  _PDF_CEXCEPTION_
#define _PDF_CEXCEPTION_

#define  PE_ENCRIPTED   0x01
#define  PE_PARAMETER_ERROR  0x02
#define  PE_PARSE_ERROR   0x03

class CPdfException
{
public:
 CPdfException(char *except_desc,int except_code );
 CPdfException(CPdfException &);
 ~CPdfException();
 void debug_print();
protected:
private:
 char *desc;
 int code;
};

/************************************************************************
* 异常实现                                                            
************************************************************************/
#include <string.h>
#include <stdio.h>
#include "CPdfException.h"

CPdfException::CPdfException(char *except_desc,int except_code )
{
 int len = strlen(except_desc);
 desc = new char[len+1];
 strcpy(desc,except_desc);
 code = except_code;
}

CPdfException::CPdfException(CPdfException &s)
 :desc(new char[strlen(s.desc)+1])
{
 strcpy(desc,s.desc);
 code = s.code;

}
CPdfException::~CPdfException()
{
 if(desc)
  delete desc;
};

void CPdfException::debug_print()
{
 printf("Exception code %d at function %s./n",code,desc);
}

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

对象生死劫 - 构造函数和析构函数的异常

对象生死劫 - 构造函数和析构函数的异常 构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程。当一个对象诞生时,构造函数负责创建并初始化对象的内部环境,包括分配内存、创建内部...

对象生死劫 - 构造函数和析构函数的异常

转自http://www.cnblogs.com/leadzen/archive/2008/02/12/1067474.html       在设计类时,构造函数和析构函数往往需要十分的小心。平时不...

C++ Primer 面向对象编程 15.3 基类派生类相互转换 15.4. 构造函数和复制控制

1.将对象传给希望接受引用的函数时,引用直接绑定到该对象,虽然看起来在传递对象,实际上实参是该对象的引用,对象本身未被复制,并且,转换不会在任何方面改变派生类型对象,该对象仍是派生类型对象。 将派生类...

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10;  int b =a;   自己定义的...

面向对象编程—基类构造函数和复制控制

由于每个派生类对象都包含一个基类部分,因此可以像使用基类对象一样在派生类对象上执行操作。 对于指针/引用,可以将派生类对象的指针/引用转换为基类子对象的指针/引用。 基类类型对象既可以作为...

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10;  int b =a;   自己定义的类的对象同...

深度搜索C++对象模型 - 复制构造函数

 深度搜索C++对象模型: 复制构造函数 由构造函数篇可以猜到, 复制构造函数其实也"不一定"会被编译器产生.. 提到复制,自然是类成员之间的复制, 有三种情况 会把一个 class obj...

C++学习 (3)--多重继承类对象的构造函数参数的传递方法

#include #include using namespace std; /************************************************************...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)