Posted on 2010-06-18 21:16
易水若寒 阅读(245)
评论(0) 编辑 收藏 引用
今天遇到一个问题,在试用自建的类变量时,当在一个子程序中定义的一个类变量,在程序结束类变量自动析构的时候却将相同类的另一个变量给误析构了。百思不得其解,一顿上网搜索,终于在《C++编程指南》中找到这样一段话:
带有指针类型数据成员的类要声明其复制构造函数和赋值操作符
如果需要,并且没有明确声明时,编译器会为类暗中生成一个复制构造函数和一个赋值操作符。编译器定义了复制构造函数和赋值操作符,在 Smalltalk 术语中这通常称为“shallow-copy”(浅拷贝):明确的说,即按成员拷贝以及对指针按位拷贝。使用编译器生成的复制构造函数和默认的赋值操作符肯定会造成内存泄漏。
我恍然大悟,原来在自建的类声明中并没有对复制和赋值的操作符“+”进行重载定义。
示例
//摘自 [Meyers, 92].
void f()
{
String hello("Hello");//假设 String 类型
//由指向 char 型
//数组的指针来实现。
{ //进入新的域(程序块)
String world("World");
world = hello; //赋值语句使 world 丢失了
//它最初指向的内存单元
} //从域中退出时
//解构 world;
//此时也间接的解构了 hello
String hello2 = hello; //将已解构过的 hello 赋给
// hello2
}
以上代码中,储存字符串“World”的内存单元在赋值语句之后丢失了。结束内部程序块时,销毁了world;因此,由 hello 引用的内存单元也丢失了。已经解构的 hello 赋给了 hello2。