C:如果没有指向它的指针,如何释放内存?

时间:2011-02-08 12:56:42

标签: c function struct malloc free

我有一个函数,它创建一个结构并返回新结构本身。该结构包含一个数字数组和一个显示有多少数字的整数(这就像一个数组)。 所以我有makeStruct,它创建一个临时结构,然后返回它。在main中,我调用此函数并将其分配给我的结构myNumbers。 这样做的结果是在函数中创建了一个结构实例,复制到myNumbers然后删除。我的假设是否正确?

这似乎编译正确,但我看不到释放分配内存的方法,因为没有指针指向我的结构。我怎样才能释放记忆?

#include <stdlib.h>
#include <stdio.h>

typedef struct{
    int* numbers; /*array of numbers*/
    int  crowd; /*crowd of numbers*/
} magicNums;

magicNums makeStruct(int crowd){
    magicNums tempStruct, *struct_ptr=&tempStruct; /*my temp struct and its pointer*/
    struct_ptr=(magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/
    tempStruct.numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/
    return tempStruct;
}

int main() {
    magicNums myNumbers;
    myNumbers=makeStruct(10);
    /*magicNums *myNumbers_ptr=&myNumbers;  This won't work             */
    /*free(myNumbers_ptr);                  This won't work             */
    /*free(&myNumbers);                     This won't work             */
    return 0;
}

9 个答案:

答案 0 :(得分:4)

至于回答你的问题,“如何在没有指针的情况下释放内存以构建它?”。

你做不到。你的代码泄漏了内存。

然而,您的代码中存在许多错误

 magicNums tempStruct, *struct_ptr=&tempStruct;
 struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 

以上两行首先设置struct_ptr =&amp; tempStruct; ,稍后用malloc的返回替换该指针。这两行完全相同:

 magicNums tempStruct;
 magicNums *struct_ptr;
 struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 

这可能会更明确地说明发生了什么。

返回tempStruct;

通过在这里返回tempStruct,你已经丢失了指向struct_ptr的指针,因此你无法释放它,并且你会泄漏内存。

但是你没有丢失指向tempStruct.numbers的指针。您可以在主页中释放它:

magicNums myNumbers;
myNumbers=makeStruct(10);
free(myNumbers.numbers);

magicNums不是指针,你不能也不需要释放它。你按值返回一个结构,所以没关系 - 那里没有动态内存。

答案 1 :(得分:2)

这是正确的,你无法释放内存,因为你没有有效的指针。您已成功创建内存泄漏。

您需要从该函数返回结构指针,而不是按值返回结构。

为什么你首先使用malloc()呢?

答案 2 :(得分:1)

尝试返回指针。

magicNums* makeStruct(int crowd){
    magicNums *tempStruct = (magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/

    tempStruct->numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/
    return tempStruct;
}

int main() {
    magicNums *myNumbers;
    myNumbers = makeStruct(10);

    free(myNumbers->numbers);
    free(myNumbers);
    return 0;
}

答案 3 :(得分:1)

这里有很多问题。首先,回答这个问题 - 你做不到。但是,这不是你的问题:

我猜你想要这个:

magicNums* makeStruct(int crowd){
    magicNums *struct_ptr = 
        (magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/
    struct_ptr->crowd = crowd;
    struct_ptr->numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/
    return struct_ptr;
}

然后主要是

int main() {
    magicNums *myNumbers;
    myNumbers = makeStruct(10);

    free (myNumbers->numbers);        
    free (myNumbers);

    return 0;
}

答案 4 :(得分:1)

您不需要为结构本身分配内存,您的makeStruct应如下所示:

magicNums makeStruct(int crowd) {
    magicNums tempStruct;
    tempStruct.numbers = (int *) malloc(sizeof(int) * crowd);
    tempStruct.crowd = crowd;
    return tempStruct;
}

尽管tempStruct是在堆栈上创建的,并在函数返回时自动释放,但该函数将复制tempStruct并返回该值。

然后你可以像这样使用它:

int main() {
    magicNums myNumbers;
    myNumbers = makeStruct(10);
    free(myNumbers.numbers);
}

答案 5 :(得分:0)

  

如何在没有时释放内存   有一个指向它的指针?

祝你好运!如果你不知道它在哪里,你怎么能希望释放它?解决方案:记住你把它放在哪里!

答案 6 :(得分:0)

据我所见,您只需要malloc内的第一个makeStruct

然后在int main(void)(!)中稍后你可以

free(myNumbers.numbers);

答案 7 :(得分:0)

您可以在函数本身进行清理,同时将结构的副本返回到主程序。然后您将获得该副本的引用,并且可以在使用后释放它以回收内存。

编辑:请参阅Martins的答案,这可能正是您想要的:)

答案 8 :(得分:0)

以下代码与您对自己所做行为的描述相符。这是否是你想做的,我不知道。

#include <stdlib.h>
#include <stdio.h>

typedef struct{
    int* numbers; /*array of numbers*/
    int  crowd; /*crowd of numbers*/
} magicNums;

magicNums makeStruct(int crowd){
    magicNums tempStruct;
    tempStruct.crowd = crowd;
    tempStruct.numbers = malloc(sizeof(*tempStruct.numbers)*crowd);
    return tempStruct;
}

int main(void) {
    magicNums myNumbers = makeStruct(10);
    free(myNumbers.numbers);
    return 0;
}