-1

所以我知道 mallocs 适用于堆而不是堆栈。

我有几个问题:

是否有任何代码被分配或释放?

我没有看到任何空闲语句,所以我假设没有任何内容被释放,所以内存泄漏是否正确?

只是出于好奇,如果我尝试释放 ptr,它会崩溃。如果我尝试释放手柄,它可以正常工作。

  int num;
        int *ptr;
        int **handle;

        num = 14;
        ptr = (int *)malloc(2 * sizeof(int));
        handle = &ptr;
        *ptr = num;
        ptr = #
        handle = (int **)malloc(1 * sizeof(int **));
4

3 回答 3

6

是的,此代码使用malloc调用分配内存。当您尝试ptr在最后释放时,您会看到崩溃,因为它被重新分配给&num,它是在堆栈上分配的并且不能被释放。取消分配堆栈变量不仅没有意义(因为无论如何它都会在函数退出时被丢弃),而且这样做也是不合法的,因为它没有被显式分配。您仍然可以释放handle,因为它仍然指向它分配的堆本地存储。

要回答您的另一个问题,是的,存在内存泄漏。此外,由于ptr已设置为指向其他位置,因此现在无法释放它指向的原始内存,因为您不再知道原始地址。

于 2013-02-18T10:08:48.167 回答
1

是的,它使用未释放的内存分配内存malloc,因此存在泄漏。您已经用地址覆盖了分配内存ptr的地址,num因此您无法释放它。初始分配内存的地址丢失了,所以这是一个泄漏。

于 2013-02-18T10:11:09.747 回答
1

如果没有释放,则存在内存泄漏。(检查它valgrind

您无法释放ptr,因为它指向无法释放的堆栈变量内存区域(查看指令ptr = #)。

于 2013-02-18T10:11:20.600 回答