条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
这是非常重要的一条,经常会导致一些内存的泄露,如以下这段代码所示:
// 一个很简单的string类
class string {
public:
string(const char *value);
~string();
... // 没有拷贝构造函数和operator=
private:
char *data;
};
string::string(const char *value)
{
if (value) {
data = new char[strlen(value) + 1];
strcpy(data, value);
}
else {
data = new char[1];
*data = '\0';
}
}
inline string::~string() { delete [] data; } //还是会产生一个函数的地址
来看看在 没有拷贝构造函数和operator=的情况,
最简单的:
string a("hello");
string b("world");
b=a;
如果没有拷贝构造函数,系统会默认进行一对一的赋支,那么b中的char指针数据就丢失了。
另外一种情况,如果离开了它的生存空间被系统析构
string a("hello"); // 定义并构造 a
{ // 开一个新的生存空间
string b("world"); // 定义并构造 b
...
b = a; // 执行 operator=,
// 丢失b的内存
} // 离开生存空间, 调用
// b的析构函数
string c = a; // c.data 的值不能确定!
// a.data 已被删除
delete c // delete a;
那么不难想到,像这样被系统析构掉的还有一种情况就是传值
void donothing(string localstring) {}
那么这个函数退出时,localstring就被析构,牵连到的还有原来的值
effectiv给出一个比较均衡的方法是可以用比较复杂的计数,来跟踪当前数据结构;或者对一些花费代价
比较大的类里,将拷贝和构造设置成私有的函数
在写法上可以将拷贝和赋值写在一起
比如
string& string::operator=(const string& rhs)
{
//do...
}
string::YourClass(string &str)
{
*this=str;//调用赋值函数
}
分享到:
相关推荐
构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 默认...
C++ 拷贝构造函数 赋值构造函数 解释
C++实现 类string的 普通构造函数, 拷贝构造函数 析构函数 和赋值函数
不要轻视拷贝构造函数与赋值函数 不要轻视拷贝构造函数与赋值函数 不要轻视拷贝构造函数与赋值函数 不要轻视拷贝构造函数与赋值函数 不要轻视拷贝构造函数与赋值函数
C++拷贝构造函数和赋值操作 拷贝构造函数对同一个对象来说只会调用一次,而且是在对象构造时调用。此时对象本身还没有构造,无需要去释放自己的一些资源。而赋值操作可能会调用多次,你在拷贝之前要释放自己的一些...
编写类String 的构造函数、析构函数和赋值函数,已知类String 的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String...
包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数、什么情况下调用赋值运算符。最后,简单的分析了下深拷贝和浅拷贝的问题。有需要的朋友可以看下
条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符 条款12: 尽量使用初始化而不要在构造函数里赋值 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同 条款14: 确定基类有虚析构...
关于拷贝构造函数和赋值函数.txt
C++构造函数_析构函数和赋值操作符学习小结
用同一个类的源对象构造一个目标对象时,会调用拷贝构造函数来构造目标对象,如果没有定义拷贝构造函数,将调用类的默认拷贝函数来构造目标对象。2 . 当一个函数的返回值为一个类的对象时,如果在调用函数中,没有...
C++复制(拷贝) 构造函数实验代码 每个类只有一个析构函数 和一个赋值函数 ,但可以有多个构造函数 (包含一个拷贝构造函数 ,其它的称为普通构造函数 )。对于任意一个类 A ,如果不想编写上述函数, C++ 编译器将...
还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。 编程环境:vs2010,语言:...
条款11:为需要动态分配内存的类声明一个拷贝构造函数和一个赋值函数 条款12:尽量使用初始化而不要在构造函数里赋值 条款13:初始化列表中成员列出顺序和它们在类中的声明顺序相同 条款14:确定基类有虚析构函数 条款15...
我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数、析构函数、复制构造函数和重载赋值操作;即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数。例如以下类: 代码如下: class CTest { ...
初始化和赋值问题详解C++ 拷贝构造函数和赋值运算符详解C++中对构造函数和赋值运算符的复制和移动操作C++中复制构造函数和重载赋值操作符总结深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结...