桂华流瓦的别致小院

每天进步一点!

C++中的位拷贝与值拷贝

以String类为例:

class String{

public:

        String(const char * p=NULL);//默认构造函数

        ~String(void);//默认析构函数

        String(const String &str);//拷贝构造函数

        String & operator = (const String &str);//赋值函数

private:

        char * m_data;

}

位拷贝拷贝的是地址,而值拷贝拷贝的是内容。

假定有两个String类对象A和B,则A.m_data和B.m_data分别指向两个不同的空间。

如果没有覆写赋值函数,执行语句:A.m_data = B.m_data;则编译器默认进行位拷贝,A.m_data与B.m_data就指向了同一块地址,虽然A.m_data的内容与B.m_data的内容一致了,但会出现如下问题:

(1)A.m_data原来指向的内存没有释放,容易出现内存泄露;

(2)当A.m_data和B.m_data中的任意一个被修改,则会影响另外一个,对数据不安全;

(3)当对象A、B析构的时候,内存将被释放两次。


当用一个已经初始化过的自定义类类型对象去初始化另一个对象的时候,拷贝函数将被自动调用。也就是说当类的对象需要拷贝时,拷贝函数就会被调用。

以下情况都会调用拷贝构造函数:

(1)一个对象以值传递的方式传入函数体;

(2)一个对象以值传递的方式从函数体返回;

(3)一个对象需要用另一个对象来初始化。

默认的拷贝构造函数是位拷贝,如果类对象中有指针类型的成员,在调用拷贝构造函数的时候就会出现两个对象的指针成员指向了同一块内存,那么就会出现上面所提的三个问题。

阅读更多
个人分类: C/C++
想对作者说点什么? 我来说一句

内存拷贝的优化方法

zgqtxwd zgqtxwd

2008-04-27 19:07:00

阅读数:125

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭