malloc、free、多指针,是怎么工作的?
Malloc, free, and multiple pointers, how does it work?
我有多个指针指向动态分配的内存,这些内存是使用单个 malloc 分配的。
int *p1, *p2;
p1 = (int*)malloc(sizeof(int) * 10);
p2 = &p1[5];
free(p2);
p1[5] = 3;
p1[6] = 5;
现在我的问题是 'free(p2)' 语句会做什么?它会在 p1[5] 之前释放内存吗?提前使用内存是否安全 p1[5](即 p1[6], p1[7] , . .)
您无法预测此函数的行为,因为它是未定义的行为
来自参考:
Deallocates the space previously allocated by malloc()
, calloc()
, aligned_alloc
, (since C11) or realloc()
.
If ptr
is a null pointer, the function does nothing.
The behavior is undefined if the value of ptr
does not equal a value returned earlier by malloc()
, calloc()
, realloc()
, or aligned_alloc()
(since C11).
—free
, C++ Reference
强调我的:你在这种情况下使用 free
将涉及释放一个指针,该指针不是通过使用任何这些函数获得的;它是通过转换从malloc
获得的指针获得的,因此无效。
我对 可能 的最佳猜测是分段错误;但这取决于您的编译器,不是您或我可以保证的。
所以不要这样做。
释放未被 malloc
/calloc
ed 的指针是未定义的行为。
某些分配器(例如 glibc)有时可以检测到它并确定性地使程序崩溃并显示 free(): invalid pointer
错误消息,但从技术上讲,如果您这样做,您将失去对程序行为的所有保证。
我有多个指针指向动态分配的内存,这些内存是使用单个 malloc 分配的。
int *p1, *p2;
p1 = (int*)malloc(sizeof(int) * 10);
p2 = &p1[5];
free(p2);
p1[5] = 3;
p1[6] = 5;
现在我的问题是 'free(p2)' 语句会做什么?它会在 p1[5] 之前释放内存吗?提前使用内存是否安全 p1[5](即 p1[6], p1[7] , . .)
您无法预测此函数的行为,因为它是未定义的行为
来自参考:
Deallocates the space previously allocated by
malloc()
,calloc()
,aligned_alloc
, (since C11) orrealloc()
.If
ptr
is a null pointer, the function does nothing.The behavior is undefined if the value of
ptr
does not equal a value returned earlier bymalloc()
,calloc()
,realloc()
, oraligned_alloc()
(since C11).—
free
, C++ Reference
强调我的:你在这种情况下使用 free
将涉及释放一个指针,该指针不是通过使用任何这些函数获得的;它是通过转换从malloc
获得的指针获得的,因此无效。
我对 可能 的最佳猜测是分段错误;但这取决于您的编译器,不是您或我可以保证的。
所以不要这样做。
释放未被 malloc
/calloc
ed 的指针是未定义的行为。
某些分配器(例如 glibc)有时可以检测到它并确定性地使程序崩溃并显示 free(): invalid pointer
错误消息,但从技术上讲,如果您这样做,您将失去对程序行为的所有保证。