【问题标题】:How can I fix this memory leak with char*?如何使用 char* 修复此内存泄漏?
【发布时间】:2019-07-31 05:01:28
【问题描述】:

我正在编写一个简短的方法来获取达尔文的 MAC 地址。但是,我不断收到以下错误消息:

malloc: can't allocate region
*** mach_vm_map(size=3907498536060022784) failed (error code=3)
malloc: *** set a breakpoint in malloc_error_break to debug

我认为这是由于内存泄漏造成的。

我尝试通过引用传递char* addr 变量,但没有成功。

我的方法是:

char* getPhysicalAddress() {

    char* addr;
    #ifdef __APPLE__

        FILE *fp = popen("ifconfig en0 | awk '/ether/{print $2}'", "r");

        if (fp != NULL) {
            fscanf(fp, "%s", addr);

            pclose(fp);
        }
        else {
            addr = "[unknown]";
        }

    #endif

    #ifdef __linux__

        FILE* file = popen("cat /sys/class/net/eth0/address", "r");

        if (file != NULL) {
            fscanf(file, "%s", addr);

            pclose(file);
        }
        else {
            addr = "[unknown]";
        }

    #endif

    return addr;
}

在我的主函数中,我使用char* addr = getPhysicalAddress(); 调用该函数。

如何解决此方法中的内存泄漏问题?

【问题讨论】:

  • 你能用std::string代替原始的char*吗?
  • 这个问题有 0 个 C++ 代码。然后,这就是您的问题,您使用的是未初始化的原始指针。指针指向某个随机区域,您使用未初始化的原始指针调用 fscanf (这是一个不安全的函数)。然后 Fscanf 将某些内容读取到某个地方,从而破坏了您的记忆。非常简单的解决方案:不要使用原始指针。从来没有,无处可去。
  • 您应该使用 C 编码或更改您的代码以匹配 C++ STL

标签: c++ memory-leaks


【解决方案1】:

让我们看看这段代码:

char* addr;
...
fscanf(fp, "%s", addr);

看起来,从这段代码中,您想从fp 文件中读取字符串addr。但是,正如所写,此代码会导致未定义的行为(哦,不!),在您的情况下,它看起来正在破坏您的内存管理器,因此出现 malloc 错误。

那么这里发生了什么?请记住,addr 并不是真正的字符串。相反,它是一个char*,这意味着它是一个变量,上面写着“请查看我所指的位置,你会找到存储一些字符的空间”。但是,您未对其进行初始化,这意味着它指向内存中的某个随机区域,可能是您实际上并不拥有的空间。当fscanf 尝试将它读取的字符写入该位置时,它会破坏碰巧在该位置的任何内存,这是一件坏事。

换句话说,这不是内存泄漏。相反,它是一个未初始化的指针写入。

有几个选项可以解决这个问题。一种选择是将addrchar* 转换为实际的字符数组,这意味着addr 本身将表示“这里有一些空间可以放置一些字符”。您需要调整 fscanf 调用以确保您没有读取太多字符,否则您将面临溢出缓冲区的风险。

另外,既然你已经用 C++ 标记了它,另一种选择是使用像 std::string 这样的类型来保存内存,然后使用循环从 fp 中提取字符,将它们附加到 std::string对象。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2018-05-09
    相关资源
    最近更新 更多