• C++中结构体在顶层和底层之间的传递与delete内存问题


    在顶层中定义了一个结构体变量,并且对其进行初始化。在底层程序中定义了一个该结构体的指针变量,现在需要将顶层的结构体传递给底层。

    struct aaa
    {
          int a;
          int b;
          char c;
    }

    方式1:值传递

      在底层中也定义一个结构体变量,而不是结构体的指针变量,将该结构体作为函数形参直接传递。

      该方式最为简单直观明了,但是底层的该结构体变量只是在底层的中的一个代码块中起作用。而如果定义成结构体指针变量,则只要底层的类存在,该变量就一直存在。

    方式2:结构体的地址传递

      在底层中定义结构体的指针变量,函数的形参为结构体的地址,将顶层的结构体地址传递到底层。

      在底层中

    aaa *aaa2;
    aaa2 = new aaa;
    updateaaa(aaa* aaa1);
    aaa2 = aaa1;

      这种方式是将顶层的地址传递给了底层,其实顶层和底层还是公用的一块空间,这种在delete内存时容易发生错误,就是在顶层析构函数delete时已经把这个空间给删除了,在底层析构函数的delete时又删除一遍,此时aaa2只有地址没有空间,会出现错误。

    方式3:结构体的地址传递和内存空间复制(针对方式2的修改)

    aaa *aaa2;
    aaa2 = new aaa;
    updateaaa(aaa* aaa1);
    *aaa2 = *aaa1;

      这种定义,aaa2在底层的堆中申请了自己的一块空间,当进行复制的时候是把aaa1的内存空间内容赋值给了aaa2,所以在delete时顶层和底层之间不会互相影响。

  • 相关阅读:
    一切都是对象
    对象入门
    同步计算输入的各个数的总和与平均值
    与时间有关的类Date,DateFormat,Calendar
    获取文件信息
    串行化
    分解
    高速缓存
    压缩
    MyCAT实现MySQL的读写分离
  • 原文地址:https://www.cnblogs.com/pupilLZT/p/9473434.html
Copyright © 2020-2023  润新知