zoukankan      html  css  js  c++  java
  • 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时顶层和底层之间不会互相影响。

  • 相关阅读:
    Fix “Could not flush the DNS Resolver Cache: Function failed during execution” When Flushing DNS
    Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
    FTP服务器原理
    SAMBA 服务器原理
    时间服务器:NTP 服务器
    账号控管:NIS服务器
    NFS服务器原理
    DHCP服务器原理
    Linux防火墙
    linux网络完全与防护
  • 原文地址:https://www.cnblogs.com/pupilLZT/p/9473434.html
Copyright © 2011-2022 走看看