不知不觉中调用的默认拷贝构造函数

原创 2006年06月09日 11:27:00

        大家都知道在一个对象的赋值过程中就会调用默认的拷贝
构造函数(如果你没有明确定义这部分代码的情况下),这
时在你的类的设计过程中有一个指针成员变量,这时可能就
可能潜在一定的危险在里边。在这里举个例子来说明以下:
class test
{
public:
test(void) { nIndex = new int; }
~test(void) { delete nIndex; nIndex = NULL; }
private:
int *nIndex;
};
        有的时候我们可能会这样设计自己的代码,在构造函数内
分配内存,在析构函数中释放内存,看似没有什么问题,但
是在这个程序中潜在着危险。试想一下,我们这样来使用这
个类:
    test test1;
    test test2 = test1;
    test test3;
    test3 = test2;
     在这里,test的构造函数被调用了两次(test1和test3),
而析构函数却被调用了3次,test1,test2,test3各一次。
由于赋值的默认解释是按成员赋值,所以在程序结束的时
候,test1,test2,test3中各包含一个指针,他们都指向
test1构造时分配的那块内存。在test3建立时分配的内存的
指针没有被保留下来,被赋值语句覆盖掉了(test3 = test2;),
这样这块内存就永远丢掉了,也就出现了内存泄露。上面的3次
析构,预示着相同的内存要释放3次,这种情况导致的结果是很
糟糕的。
    知道上面的问题,以及问题的所在,我们就可以对它进行修
正,是程序按我们自己的方式去执行。既然是默认拷贝构造出的
问题,那我们就把它定义清楚:
class test
{
public:
 test(void) { nIndex = new int; }
 ~test(void) { delete nIndex; nIndex = NULL; }
 test(const test &t);
 test& operator=(const test &t);
private:
 int *nIndex;
};
inline test::test(const test &t)
{
 nIndex = new int;
 *nIndex = *(t.nIndex);
}
inline test& test::operator=(const test &t)
{
 if (this != &t)
 {
  delete nIndex;
  nIndex = new int;
  *nIndex = *(t.nIndex);
 }
 return *this;
}

   进行上述修改后,我们就可以尽情地使用该类。在赋值时,
也不会出现意想不到的情况。

C++ - 默认复制构造函数 执行 浅拷贝

默认复制构造函数 执行 浅拷贝 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23941807 C++, 会默认生成一个复...
  • u012515223
  • u012515223
  • 2014年04月17日 16:29
  • 3405

默认构造函数和拷贝构造函数

如果类包含内置或复合类型的成员,则该类就不应该依赖于合成的默认构造函数,它应该定义自己的构造函数来初始化这些成员。...
  • Sun19910114
  • Sun19910114
  • 2014年10月08日 09:51
  • 2025

调用拷贝构造函数的几种情况(附面试题)

1. 深拷贝和浅拷贝(拷贝构造函数的使用)   有时候需要自己定义拷贝构造函数,以避免浅拷贝问题。 在什么情况下需要用户自己定义拷贝构造函数: 一般情况下,当类中成员有指针变量、类中有动态内...
  • zzwdkxx
  • zzwdkxx
  • 2016年11月30日 16:24
  • 2570

拷贝构造函数的调用

一直说到拷贝构造函数,构造函数在创建对象时被调用,哪儿拷贝构造函数呢?? 1.当用 类的一个对象初始化另一个对象时: int main() { point A(1,2); point B(...
  • gogoky
  • gogoky
  • 2016年04月12日 22:22
  • 739

C++中关于拷贝构造函数的调用方式有以下三种!

#includeusing namespace std;class Time{ int hour,minute,second;public: Time():hour(0),minute(0),seco...
  • yiruirui0507
  • yiruirui0507
  • 2010年10月09日 12:00
  • 4103

子类的拷贝、赋值构造函数切记不忘父类成员

#include using namespace std; class Base { public: Base(char *_name){int len=strlen(_nam...
  • moruihong
  • moruihong
  • 2010年05月05日 21:11
  • 1658

自定义拷贝构造函数&&默认的拷贝构造函数

自定义拷贝构造函数 类名::类名(const 类名 &对象名) {    拷贝构造函数的函数体 } 利用下述语句调用拷贝构造函数 Rectangle p2(p1); #include using ...
  • nyist_yangguang
  • nyist_yangguang
  • 2017年03月05日 18:10
  • 363

拷贝构造函数的调用时机

拷贝构造函数的调用有四种场景 假设定义了一个类A: class A{ public: A(const A& obj) //拷贝构造函数 {} }; 第一种copy构造函数调用: void mai...
  • u010864559
  • u010864559
  • 2017年03月28日 18:58
  • 201

什么时候需要定义拷贝构造函数

当没有定义拷贝构造函数时,对象值传递时是位拷贝,但是通常情况下,位拷贝已经能满足我们的要求,是我们不必自己定义拷贝构造函数。但是什么时候需要自己定义呢? 这里有个简单的规则:如果你需要定义一个非空的...
  • suxinpingtao51
  • suxinpingtao51
  • 2014年07月04日 15:03
  • 4809

拷贝构造函数关于指针的拷贝问题

1.拷贝构造函数的定义:如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值。 !拷贝构造函数的第一个参数必须是一个引用类型。 合成拷贝构造函数: 如果我们没有为一个类定义拷贝构造...
  • u010732356
  • u010732356
  • 2017年03月23日 18:49
  • 975
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不知不觉中调用的默认拷贝构造函数
举报原因:
原因补充:

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