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

时间:2018-02-22 12:39:29

标签: c memory-leaks c++-cli

我在按钮的点击事件中输入了下一个代码:

         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.S。:我正在使用C库(基于DLL构建)和C ++ / CLI应用程序。

提前谢谢。

编辑:

PNIO_DEV_ADDR是:

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;

当两个第一个变量是枚举时。

EDIT2:

这是DLL中函数write的入口点:

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_DEV_ADDR*。抱歉,我无法访问此功能,因为它位于另一个第三方DLL上。我应该复制addr指针吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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