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

原创 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);
}

 

 

 

关于c++中不允许复制构造函数传值参数的理解

问题源于看剑指offer上的一道面试题,题目如下: class A{ private: int value; public: A(int n){ value = n; } A...
  • xiaoquantouer
  • xiaoquantouer
  • 2017年04月12日 17:27
  • 1076

C++13.1 复制构造函数-----临时对象(不是很懂)

简介 =============================================================================================== ...
  • hlsdbd1990
  • hlsdbd1990
  • 2015年06月24日 15:04
  • 410

为什么需要拷贝(复制)构造函数

转载自:这里 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy ...
  • YoungDou
  • YoungDou
  • 2015年04月29日 14:27
  • 1293

C++返回值为对象时复制构造函数不执行怎么破

先说点背景知识,调用复制构造函数的三种情况:  1.当用类一个对象去初始化另一个对象时。  2.如果函数形参是类对象。  3.如果函数返回值是类对象,函数执行完成返回调用时。  在辅导学生上机时,有同...
  • sxhelijian
  • sxhelijian
  • 2016年03月25日 11:42
  • 3461

C++之对象数组+对象成员+拷贝构造函数(深/浅)

对象数组实例(栈中实例化和堆中实例化):class Coordinate { public: int m_iX; int m_iY; };int main() { Coordi...
  • u013486414
  • u013486414
  • 2017年03月03日 15:47
  • 1157

续:vector的push_back和复制构造函数问题

定义一个A类,其中自己定义了复制构造函数和默认构造函数。 定义一个A类的对象,把A类的对象添加到vector容器中。 其中调用A类复制构造函数次数问题。 比如:下列代码: #include #incl...
  • yang20141109
  • yang20141109
  • 2015年08月20日 22:39
  • 638

什么是复制构造函数

复制构造函数又称为拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。它存在唯一一个参数是不可变的。这个函数经常在函数调用期间于用户定义类型的值传递及返回。...
  • Jake2549794390
  • Jake2549794390
  • 2016年03月14日 13:58
  • 932

c++学习笔记(二):c++拷贝构造函数应用的四种场景

#include using namespace std; //拷贝构造函数的第一、二应用场景 class AA { public: AA() //无参构造函数 默认构造函数 { cout...
  • my_sky2012
  • my_sky2012
  • 2015年10月21日 16:33
  • 861

C++引用与复制构造函数

引用 ◆ 1、什么是引用? 引用又称别名(alias),是一种非常特殊的数据类型。它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是C++系统不为引用类型变量分配内存空间。引用...
  • dapangzi88
  • dapangzi88
  • 2017年02月07日 20:18
  • 570

C++浅层与深层复制构造函数

//浅层复制构造函数代码 #include using namespace std; class Test { public: Test() { x=new int; ...
  • liupengcheng201
  • liupengcheng201
  • 2014年03月14日 22:16
  • 1135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异常对象的传递与复制构造函数
举报原因:
原因补充:

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