【问题标题】:dynamic Memory allocation and free in CC中的动态内存分配和释放
【发布时间】:2023-03-03 05:54:22
【问题描述】:

假设我在程序中动态创建了一个字符串

char* s = malloc(sizeof(char) * 128);

在我们开始使用s之前,如何检查内存是否分配?

free(s);

在使用 free() 之前,我想检查是否有其他指向 s 的指针。

【问题讨论】:

  • 您应该做的第一件事是从您的 C 词汇表中删除 sizeof(char)。这是一种极其丑陋的 1 编写方式,它会在任何阅读您代码的人的脑海中引发警报。

标签: c


【解决方案1】:

malloc()返回一个指向新分配内存的指针或NULL。

所以检查NULL

char *s = malloc(128); /* sizeof (char), by definition, is 1 */
if (s == NULL) {
    /* no memory allocated */
} else {
    /* use memory */
    free(s);
}

只有在您(程序员)创建它们时,才会有其他指针指向 s 指向的位置。

【讨论】:

  • char *q = s 你会有两个指向同一个位置的指针。 :)
【解决方案2】:

malloc 的规范表明它将在失败时返回NULL。因此,如果malloc 没有返回NULL,那么您可以依赖分配内存的编译器。不幸的是,没有标准的方法来判断是否有任何其他指针指向相同的内存。所以在free之前你需要确保自己作为程序员不需要内存。

【讨论】:

    【解决方案3】:

    在使用 free() 之前,我想 检查是否有其他指针 指向 s。

    一般来说,你不能这样做 - 你必须自己管理所有其他指针正在做的事情。

    一个常见的助手是在释放它后将's'设置为NULL,然后你至少可以检测's'是否仍在你的其他功能中使用,但你不能自动检查's的任何副本'。

    【讨论】:

    • 我经常为此创建一个“智能免费”宏。它调用free,然后将指针设置为NULL。它适用于全局可访问的指针,但如果您制作了一堆指针副本,它就无济于事。
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 2017-06-13
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多