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