拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在不同情况下使用四元结构释放图片的所有存储器块?

如何在不同情况下使用四元结构释放图片的所有存储器块?

白鹭 - 2022-01-26 1962 0 0

几周前,我试图实作一个显示四叉树的函式。我目前的问题是关于同样的作业,所以我把这个链接传递给你所有的背景关系:如何在不同情况下使用四元结构释放图片的所有存储器块?

如您所见,存储器之前和之后的显示没有区别。

这是最简单的情况,之后它也应该适用于合成影像,例如

  • N BBNB B N NNB NBNNBN。

有人建议我使用 valgrind,告诉我要让我的程序正常作业,malloc() 必须与 free() 一样多。但我真的不知道如何解释结果(以及它是否真的有用)。

结果(我的变量名不是英文所以,affichageNormal == normalDisplay,Rendmemoire == freeMemory 和 Construit_noir == Build_black)

如何在不同情况下使用四元结构释放图片的所有存储器块?

P.S. I also have two function isWhite and isBlack to tell if a picture is black (no white elements) or white (no black element):

int isWhite(image myImage)
{
    if(myImage == NULL)
    {
        return 1;
    }
    else if(myImage->allBlack)
    {
        return 0;
    }
    else if(isWhite(myImage->son[0]) && isWhite(myImage->son[1]) && isWhite(myImage->son[2]) && isWhite(myImage->son[3]))
    {
        return 1;
    }
    return 0;
}


int isblack(image myImage)
{
    if(myImage == NULL)
    {
        return 0;
    }
    else if(myImage->allBlack)
    {
        return 1;
    }
    else if(isBlack(myImage->son[0]) && isBlack(myImage->son[1]) && isBlack(myImage->son[2]) && isBlack(myImage->son[3]))
    {
        return 1;
    }
    return 0;
}

It may be useful for the function.

Edit: In case of doubt I also add the code of normalDisplay :

void normalDisplay(image myImage)
{
    if(myImage == NULL)
    {
        printf("B");
    }
    else if(myImage->allBlack)
    {
        printf("N");
    }
    else
    {
        printf(" ");
        normalDisplay(myImage->son[0]);
        normalDispay(myImage->son[1]);
        normalDisplay(myImage->son[2]);
        normalDisplay(myImage->son[3]);
    }
}

uj5u.com热心网友回复:

从四叉树中释放存储器的一种可靠方法是确保您反馈指标不再指向有效存储器。由于您的 currentfreeMemory只需要一个block_image指标,因此该函式无法将此信息传达回呼叫者。

更好的办法是改变它的界面,以便为它提供另一个级别的间接性。

void freeMemory(image *myImage) {
    if (myImage != NULL && *myImage != NULL) {
        int sonSize = sizeof((*myImage)->son) / sizeof((*myImage)->son[0]);
        while (sonSize) freeMemory(&(*myImage)->son[--sonSize]);
        free(*myImage);
        *myImage = NULL;
    }
}

附带说明一下,您的原件freeMemory确实存在存储器泄漏,但希望您能解决这个问题。

这样,*myImage = NULL将把这个变化传达给呼叫者。在呼叫方,它看起来像这样:

puts("\nfreeMemory\n");
image white = Build_white();
image black = Build_black();
puts("before");
normalDisplay(black);
puts("");
puts("after");
freeMemory(&black);
normalDisplay(black);
puts("");
puts("before");
normalDisplay(white);
puts("\nafter");
freeMemory(&white);
normalDisplay(white);
puts("");

有了这个,您normalDisplay将更好地为您提供情况的“影像”。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *