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时顶层和底层之间不会互相影响。

原文地址:https://www.cnblogs.com/pupilLZT/p/9473434.html