浅拷贝——C++编译器默认提供的拷贝构造函数

来源:互联网 发布:java程序员桌面壁纸 编辑:程序博客网 时间:2024/05/19 16:35

浅拷贝与深拷贝区别:在执行拷贝动作时,浅拷贝只会执行简单的赋值动作。

遇到类成员变量是指针类型时,由于会直接将指针本身拷贝过去,导致有几个指针指向同一片内存,以致于最后在调用析构函数时会对同一片内存区域释放多次。

#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class Vertify{public:    Vertify(const char* name)    {        this->size_ = strlen(name);        this->pName_ = new char[size_ + 1];        strcpy(pName_, name);    }    ~Vertify()    {        if (NULL != pName_)        {            delete pName_;            pName_ = NULL;        }        size_ = 0;    }public:    int size_;    char* pName_;};int main(){    {        Vertify v1("hello ,tomorrow!");        //调用编译器提供的拷贝构造函数,而默认提供的拷贝构造函数执行的是浅拷贝        Vertify v2 = v1;    }//栈对象在{}执行完之后,内存释放,调用析构函数时对同一片内存释放两次,导致程序崩溃。    cin.get();    return 0;}
解决方案:提供一个拷贝构造函数//对症下药,指针变量需要重新分配内存以获得不同的地址值,这样delete时不会重复释放内存。    Vertify(const Vertify & obj)    {               this->size_ = obj.size_;        this->pName_ = new char[size_ + 1];        strcpy(pName_, obj.pName_);    }
0 0
原创粉丝点击