释放一个等于malloc指针的指针

释放一个等于malloc指针的指针,c,C,我很难理解一些free()行为 int* ptr1 = (int*)malloc(sizeof (int)*10); int* ptr2 = ptr1; free(ptr2); 免费(ptr2)是否将根据我的需要删除我的阵列 如果我做了: int** ptr1 = (int**)malloc(sizeof (int)*10); int* ptr2 = (int*)malloc(sizeof (int)); *ptr2 = 10; ptr1[0] = ptr2; free(ptr1); 这个代

我很难理解一些free()行为

int* ptr1 = (int*)malloc(sizeof (int)*10);
int* ptr2 = ptr1;
free(ptr2);
免费(ptr2)
是否将根据我的需要删除我的阵列

如果我做了:

int** ptr1 = (int**)malloc(sizeof (int)*10);
int* ptr2 = (int*)malloc(sizeof (int));
*ptr2 = 10;
ptr1[0] = ptr2;
free(ptr1);
这个代码正确吗?
free(ptr1)
还会删除ptr2的空间吗


分别感谢是和否

还要注意
malloc(sizeof(int)*10)可以工作,但它不一定为十个指针分配空间


为了解释第一个示例中发生的情况,在分配给
ptr2
之后,您有如下内容:

+------+ | ptr1 | ---\ +------+ \ +----------------------------+ >---> | memory allocated by malloc | +------+ / +----------------------------+ | ptr2 | ---/ +------+ +---------+---------+---------+-----+ | ptr1[0] | ptr1[1] | ptr1[2] | ... | +---------+---------+---------+-----+ | | v +----------------------------+ | memory allocated by malloc | +----------------------------+ ^ | | +------+ | ptr2 | +------+ 当您通过
ptr1
释放指向只释放该内存的内存指针时,
ptr2
指向的内存仍然存在,并且可以通过
ptr2
访问

int* ptr1 = (int*)malloc(sizeof(int)*10);
int* ptr2 = ptr1;
free(ptr2);
这很好,
ptr2
包含与
ptr1
相同的值,因此传递给
malloc()
的内存是
free()
d

那不好。您正在
ptr1
数组中存储
ptr2
的值,但没有释放它。你想要:

int** ptr1 = (int**)malloc(sizeof(int*)*10);
int* ptr2 = (int*)malloc(sizeof(int));
*ptr2=10;
ptr1[0]=ptr2; 
...
free(ptr1[0]);
free(ptr1);
注意:我还更改了
malloc()
,将10个指针分配到
int
,而不仅仅是10个
int
s(可能大小不同)


最后请注意,您使用的是C语言。我没有为您解决这一问题,因为这本身不是问题,也与您的问题无关,但(可以说)它的风格不好。

malloc
free
不知道您的数据结构。他们所知道的只是一些字节

一般来说,在
malloc
free
调用之间应该存在一对一的关系。(有很多例外,但这是一条很好的一般规则。)

free
的一次调用决不会同时释放由对
malloc
的两次调用分配的两个独立块

因此,正如其他人所说,你的问题的答案是“是”和“不是”

免费(ptr2)是否会按照我的要求删除我的阵列

我认为这里不能使用术语
delete
。报告说:

当您不再需要使用malloc获得的块时,请使用 功能自由,使块可再次分配

但是free不会自动将指针设置为NULL,因为函数返回类型本身是
void
。而且

释放块会更改块的内容。别指望 查找任何数据(例如指向数据链中下一个块的指针) 块)在释放后将其放入块中

我不是在挑起一场关于在释放指针后是否应该将其设置为NULL的辩论。然而,我很想发布这个崩溃和烧毁的示例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* ptr1 = malloc(sizeof(int)*10);
    int* ptr2 = ptr1;
    free(ptr2);
    if(ptr2!=NULL)
    {
        printf("ptr is %p\n",ptr2); // still printf
        printf("Enter a number for ptr2 :");
        scanf("%d",ptr2);
        printf("Value pointed to by ptr2 : %d\n",*ptr2);
        printf("Value pointed to by ptr1 : %d\n",*ptr1);
    }
    else
        printf("Ptr2 pointed to null");
    printf("Size of ptr1 : %d\n",sizeof(ptr1));

    if(ptr1==NULL)
        printf("ptr1 NULL\n");
    printf("Enter a number for ptr1 :");
    scanf("%d",ptr1);
    printf("Value pointed to by ptr1 : %d\n",*ptr1);
    printf("Value pointed to by ptr2 : %d\n",*ptr2);

    free(ptr1);
    if(ptr1==NULL)
        printf("ptr1 freed\n");

    return 0;
}

在第一个示例中,可以选择其中一个,但不能同时选择两个。您给
free
的唯一信息是指针的值。在第二个奇特的发明中,只有一个内存空间返回到系统。有一个名为
valgrind
的工具,我建议您查找并开始使用。它将显示程序中的任何内存泄漏(如果有)。为什么代码使用
sizeof(int)*10
来计算
int**ptr1=(int**)malloc(sizeof(int)*10)中某些指针所需的内存。我希望
int**ptr1=(int**)malloc(sizeof(int*)*10)不要强制转换
malloc()
的返回值,请参阅。谢谢!如果我定义了一个包含
int tab[10]
的结构。然后用malloc创建这个结构,用free删除它。我应该担心我的标签吗?@Kenshin:如果你分配一个
struct
malloc()
并用
free()
释放它,这将释放你用
malloc()
进行的分配,但不会释放结构引用的任何东西。简单的规则是,对于每个分配,都必须有一个匹配的
free()
-漂亮而简单。没有“递归”自由的概念。是的,但我的选项卡不是用malloc创建的。那么,我的选项卡是否被视为我的结构的一部分,或者我是否应该以某种方式删除它?@Kenshin如果您使用
malloc()
而不是
int选项卡[10]
创建结构,那么您应该只使用
free()
结构,而不是
free()
int选项卡[10]
。规则很简单-匹配
malloc()
(以及堆上分配的任何其他内容)和
free()
@Kenshin:一般来说,记住C非常愚蠢,在“背后”什么也不做是很有用的。与(例如)Java相比。有些人认为这是一个特性,而不是一个bug。这个问题是偏离主题的,但是你用一个工具来画出这个数字吗?那你可以看看。有很多可用的工具。
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* ptr1 = malloc(sizeof(int)*10);
    int* ptr2 = ptr1;
    free(ptr2);
    if(ptr2!=NULL)
    {
        printf("ptr is %p\n",ptr2); // still printf
        printf("Enter a number for ptr2 :");
        scanf("%d",ptr2);
        printf("Value pointed to by ptr2 : %d\n",*ptr2);
        printf("Value pointed to by ptr1 : %d\n",*ptr1);
    }
    else
        printf("Ptr2 pointed to null");
    printf("Size of ptr1 : %d\n",sizeof(ptr1));

    if(ptr1==NULL)
        printf("ptr1 NULL\n");
    printf("Enter a number for ptr1 :");
    scanf("%d",ptr1);
    printf("Value pointed to by ptr1 : %d\n",*ptr1);
    printf("Value pointed to by ptr2 : %d\n",*ptr2);

    free(ptr1);
    if(ptr1==NULL)
        printf("ptr1 freed\n");

    return 0;
}
ptr is 0x1c92010
Enter a number for ptr2 :4
Value pointed to by ptr2 : 4
Value pointed to by ptr1 : 4
Size of ptr1 : 8
Enter a number for ptr1 :1
Value pointed to by ptr1 : 1
Value pointed to by ptr2 : 1
*** glibc detected *** ./testp: double free or corruption (fasttop): 0x0000000001c92010 ***
Segmentation fault (core dumped)