• 浅拷贝与深拷贝


      如果一个类拥有资源(堆,即分配的动态内存),当这个类的对象发生复制时复制了资源的过程就叫深拷贝,而存在资源(堆,即分配的动态内存)但并未复制资源的情况叫浅拷贝。编译器会为类提供一个默认拷贝构造函数就是一个浅拷贝。

      浅拷贝存在的问题:类体内的成员需要开辟动态内存来存放资源,复制时如果用浅拷贝只会拷贝指向动态内存的指针,并未实际重新分配一块内存来存放资源,在对象虚构时,会出现两次释放同一块内存,导致运行错误。

      浅拷贝:

     1 #include "stdafx.h"
    2 #include <iostream>
    3
    4 class Test
    5 {
    6 public:
    7 Test(const char* name, int a) {
    8 m_a = a;
    9 m_pName = new char[strlen(name) + 1];
    10 strcpy(m_pName, name);
    11 }
    12
    13 virtual ~Test()
    14 {
    15 if (m_pName)
    16 {
    17 delete [] m_pName;
    18 m_pName = NULL;
    19 }
    20 std::cout<<"Test::~Test()"<<std::endl;
    21 }
    22
    23 void Print()
    24 {
    25 std::cout<<m_pName<<m_a<<std::endl;
    26 }
    27 protected:
    28 private:
    29 int m_a;
    30 char* m_pName;
    31 };
    32
    33 int _tmain(int argc, _TCHAR* argv[])
    34 {
    35 Test _t("测试。。。。。。", 10000);
    36 Test _b = _t;
    37 _b.Print();
    38
    39 return 0;
    40 }

      深拷贝:

     1 #include "stdafx.h"
    2 #include <iostream>
    3
    4 class Test
    5 {
    6 public:
    7 Test(const char* name, int a) {
    8 m_a = a;
    9 m_pName = new char[strlen(name) + 1];
    10 strcpy(m_pName, name);
    11 }
    12
    13 virtual ~Test()
    14 {
    15 if (m_pName)
    16 {
    17 delete [] m_pName;
    18 m_pName = NULL;
    19 }
    20 std::cout<<"Test::~Test()"<<std::endl;
    21 }
    22
    23 // 重载拷贝构造函数
    24 Test(const Test& _t)
    25 {
    26 m_a = _t.m_a;
    27 m_pName = new char[strlen(_t.m_pName) + 1];
    28 strcpy(m_pName, _t.m_pName);
    29 }
    30
    31 void Print()
    32 {
    33 std::cout<<m_pName<<m_a<<std::endl;
    34 }
    35 protected:
    36 public:
    37 int m_a;
    38 char* m_pName;
    39 };
    40
    41 int _tmain(int argc, _TCHAR* argv[])
    42 {
    43 Test _t("测试。。。。。。", 10000);
    44 Test _b = _t;
    45 _b.Print();
    46
    47 return 0;
    48 }

      

  • 相关阅读:
    在web项目中使用配置文件
    javaFx教程 scene builder 加载第三方jar包
    getResource的两种用法
    tomcat部署工具
    withMisfireHandlingInstruction
    quartz教程三
    quartz教程二
    LocalDateTime与DateTimeFormatter
    quartz demo
    在小程序中点击后跳转到另一个小程序
  • 原文地址:https://www.cnblogs.com/coderyoyo/p/2131609.html
Copyright © 2020-2023  润新知