gpt4 book ai didi

c - 如何避免这段代码中的内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 14:50:39 25 4
gpt4 key购买 nike

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

         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;

当前两个变量是枚举时。

编辑2:

这是 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 指针吗?

最佳答案

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

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

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

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

关于c - 如何避免这段代码中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com