代码之家  ›  专栏  ›  技术社区  ›  areify

如何避免此代码中的内存泄漏?

  •  0
  • areify  · 技术社区  · 6 年前

    在按钮的单击事件中,我有下一个代码:

             PNIO_DEV_ADDR addr;
             addr.AddrType = PNIO_ADDR_GEO;     //Para IO Device
             addr.IODataType = PNIO_IO_OUT;     //Escritura en PLC
             addr.u.Geo.Slot = (int)(numericUpDownSlot->Value);
             addr.u.Geo.Subslot = (int)(numericUpDownSubslot->Value);
    
             CP1626::write(&addr);
    

    PNIO_DEV_ADDR 是C结构,并且 write 是一个链接到DLL回调的函数,该回调要求 PNIO_DEV_ADDR* 参数

    每次按下按钮,我都可以在任务管理器上看到与我的应用程序关联的内存是如何增加几个字节的。

    我在谷歌上搜索并阅读了很多关于指针和引用的信息,但我不太明白我做错了什么。

    你能解释一下问题出在哪里吗?

    P、 我正在使用一个C库(构建在DLL上)和一个C++/CLI应用程序。

    提前谢谢你。

    编辑:

    PNIO\U开发地址 是:

    typedef struct {
        PNIO_ADDR_TYPE  AddrType;
        PNIO_IO_TYPE    IODataType;
        union {
            PNIO_UINT32 Addr;
            struct {
                PNIO_UINT32 reserved1[2];
                PNIO_UINT32 Slot;
                PNIO_UINT32 Subslot;
                PNIO_UINT32 reserved2;
            } Geo;                   /* geographical address */
        } u;
    } ATTR_PACKED PNIO_DEV_ADDR;
    

    当前两个变量为枚举时。

    编辑2:

    这是函数的入口点 DLL内部:

    PNIO_UINT32 write(PNIO_DEV_ADDR* addr){
        PNIO_UINT32 result;
    
        result = PNIOD_trigger_data_write_sync(g_devHndl, addr, PNIO_ACCESS_RT_WITH_LOCK);
    
        return result;
    }
    

    PNIO_trigger_data_write_sync 需要 PNIO\U开发地址* . 很抱歉,我无法访问此函数内部,因为它位于另一个第三方DLL上。我应该抄一下 addr 指针?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Abhijit Pritam Dutta    6 年前

    中有两种内存分配 C/C++ ,一个是编译时的内存分配,另一个是 dynamic memory (运行时内存分配)分配,我相信您知道这一点。编译期间的内存分配是以表单的形式完成的 stack 应用程序的 dynamic 内存分配是从 heap 应用程序的。我们需要关注内存释放,它是从 以避免内存泄漏。用于从堆栈释放内存 compiler 自动管理它。

    在您的情况下,分配是从 堆栈 . 因此,一旦控件超出当前代码所在的方法范围,它将自动释放堆栈内存。

    现在在你的情况下 PNIO_DEV_ADDR addr; ,这是编译时内存分配,根本不是动态分配的内存。所以它不会导致内存泄漏。

    内部 dll 方法,我确信它已将您的对象复制到其本地对象。