返回指向结构的指针,如何自动释放内存?

爱德华多

要从WINAPI返回大结构“ MODULEENTRY32”,我想使用一个指针,但是需要在函数内部的堆中分配内存而不删除它。然后,当我不想再使用该结构时,我知道我应该使用关键字delete释放内存。

#include <iostream>
#include <cstring>
#include <Windows.h>
#include <TlHelp32.h>

MODULEENTRY32* GetModuleEntry(const char *module_name, int PID)
{
    HANDLE moduleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, PID);

    if (moduleSnapshot != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 *moduleEntry = new MODULEENTRY32;             // Remember to delete if don't want leak
        moduleEntry->dwSize = sizeof(MODULEENTRY32);

        if (Module32First(moduleSnapshot, moduleEntry)) {
            do {
                if (strcmp(moduleEntry->szModule, module_name) == 0) {
                    return moduleEntry;
                }
            } while (Module32Next(moduleSnapshot, moduleEntry));
        }

        CloseHandle(moduleSnapshot);
    }

    return nullptr;
}

int main()
{
    int myRandomPID = 123;

    MODULEENTRY32* p = GetModuleEntry("mymodule.dll", myRandomPID);

    if (!p) {
        std::cout << "Obviously you didn't found your random module of your random PID " << std::endl;
    }

    delete p;   // I just don't want to do this

    return 0;
}

如何避免在主功能中释放内存?unique_ptr

编辑:可能的解决方案

#include <iostream>
#include <cstring>
#include <Windows.h>
#include <TlHelp32.h>

bool GetModuleEntry(const char *module_name, int PID, MODULEENTRY32* moduleEntry)
{
    HANDLE moduleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, PID);

    if (moduleSnapshot != INVALID_HANDLE_VALUE)
    {
        moduleEntry->dwSize = sizeof(MODULEENTRY32);

        if (Module32First(moduleSnapshot, moduleEntry)) {
            do {
                if (strcmp(moduleEntry->szModule, module_name) == 0) {
                    CloseHandle(moduleSnapshot);
                    return true;
                }
            } while (Module32Next(moduleSnapshot, moduleEntry));
        }

        CloseHandle(moduleSnapshot);
    }

    return false;
}

int main()
{
    int myRandomPID = 123;

    MODULEENTRY32 moduleEntry;

    if (!GetModuleEntry("mymodule.dll", 123, &moduleEntry)) {
        std::cout << "Obviously you didn't find your random module of your random PID " << std::endl;
    }

    return 0;
}
保罗·麦肯齐

我建议您不要使用指针,而只需MODULEENTRY32按值返回完整的结构即可。

我还建议您可以将返回类型包装为std::pair<bool, MODULEENTRY32>或类似类型,以便在必要时记录错误返回。

最后,如果找到模块名称,则不会关闭句柄。可以使用一些RAII来确保HANDLE关闭。

#include <iostream>
#include <cstring>
#include <Windows.h>
#include <TlHelp32.h>
#include <utility>

// Helper struct to automatically close the handle
struct ModuleRAII
{
    HANDLE *h;
    ModuleRAII(HANDLE* h_) : h(h_){}
    ~ModuleRAII() { CloseHandle(h); }
};

std::pair<bool, MODULEENTRY32> GetModuleEntry(const char *module_name, int PID)
{
    HANDLE moduleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, PID);

    if (moduleSnapshot != INVALID_HANDLE_VALUE)
    {
        // This will close the handle automatically
        ModuleRAII raii(&moduleSnapshot);

        MODULEENTRY32 moduleEntry = {};
        moduleEntry.dwSize = sizeof(MODULEENTRY32);
        if (Module32First(moduleSnapshot, &moduleEntry)) {
        do {
            if (strcmp(moduleEntry.szModule, module_name) == 0) 
                  return {true, moduleEntry};
           } while (Module32Next(moduleSnapshot, &moduleEntry));
        }
    }
    return {false, MODULEENTRY32()};
}

int main()
{
    int myRandomPID = 123;
    auto retVal = GetModuleEntry("mymodule.dll", myRandomPID);
    MODULEENTRY32& p = retVal.second;    
    if (!retVal.first) {
        std::cout << "Obviously you didn't found your random module of your random PID " << std::endl;
    }

    return 0;
}

这基本上是该功能的故障安全实现。它没有经过测试,但是显示了所使用的各种技术,所有这些都没有动态分配。

请注意,该函数返回a std::pair<bool, MODULEENTRY>,因此基本参数保持不变。唯一的区别是,你通过访问或者获取的信息first(测试功能是否失败与否),并且second,对于实际的MODULEENTRY

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

执行:函数返回指向内存的指针

返回指向本地结构的指针

如何释放()指针指针引用的内存?

返回指向结构的指针后的分段错误

如何使用shared_ptr和不应该释放的指向结构的指针

如何释放指向整数数组的指针

返回指向结构数组的指针

返回指向已分配内存的指针?

从函数返回指向结构的指针

释放指向包含数组的结构的指针

删除操作员如何使用指向基类的指针释放内存

如何修复我的代码以从函数返回指向结构的指针

strstr()是否返回指向已分配内存的指针,需要我稍后手动释放它吗?

在C中返回指向结构的指针

使用动态内存分配返回指向结构的指针

C-如何正确释放指向n个char((* p)[n])数组的指针的内存?

c ++从函数返回指向结构的指针

释放结构中指向其他结构的指针

返回指针内容后如何释放指针

默认析构函数是否释放成员指针指向的内存?

如何释放内存到C中的指针

如何通过指针 a (placement new) 释放内存?

结构指针包含指向 char (string) 的指针,如何为其分配内存?

指向结构指针的指针中的内存分配

如何为指向指针的指针分配内存?

当 mprobe 被传递一个指向已释放内存块的指针时,它应该返回什么?

如何在C中返回指向结构数组的指针

如何释放在双指针结构上分配的内存

释放指向结构中数组的指针会导致 AddressSanitizer 错误