realloc() 是否使所有指针无效?
Does realloc() invalidate all pointers?
注意,这个问题不是问 realloc()
是否使原始块中的指针无效,而是询问它是否使所有其他指针无效。
我对 realloc()
的性质有点困惑,特别是它是否移动了任何其他内存。
例如:
void* ptr1 = malloc(2);
void* ptr2 = malloc(2);
....
ptr1 = realloc(ptr1, 3);
在此之后,我可以保证 ptr2
指向与 realloc()
调用之前相同的数据吗?
After this, can I guarantee that ptr2 points to the same data it did
before the realloc() call?
是的。 realloc
不会影响您所做的其他 pointers/memory 分配。
注意realloc
的方法:
ptr = realloc(ptr, ...);
如果 realloc
失败, 是不安全的。参见 Does realloc overwrite old contents?
ptr2
不受 ptr1
.
的重新分配影响
是的,ptr2
不受 realloc()
的影响,它与 realloc()
调用没有任何关系(根据当前代码)。
但是,FWIW,根据 realloc()
的 man page,(强调我的)
The realloc() function returns a pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr,
ptr1
可能会被更改。
也就是说,
ptr1 = realloc(ptr1, 3);
风格很危险。如果 realloc()
失败,
The realloc() function returns .... or NULL if the request fails
和
If realloc()
fails the original block is left untouched; it is not freed or moved.
但是,根据您的陈述,在失败的情况下,NULL
return 将覆盖实际内存,丢失实际内存并造成内存泄漏。
如果内存可用,则堆 realloc 会分配它。
如果不是,它就像 malloc 一个新大小的块,它在那里 memcpy 你的内容。
注意,这个问题不是问 realloc()
是否使原始块中的指针无效,而是询问它是否使所有其他指针无效。
我对 realloc()
的性质有点困惑,特别是它是否移动了任何其他内存。
例如:
void* ptr1 = malloc(2);
void* ptr2 = malloc(2);
....
ptr1 = realloc(ptr1, 3);
在此之后,我可以保证 ptr2
指向与 realloc()
调用之前相同的数据吗?
After this, can I guarantee that ptr2 points to the same data it did before the realloc() call?
是的。 realloc
不会影响您所做的其他 pointers/memory 分配。
注意realloc
的方法:
ptr = realloc(ptr, ...);
如果 realloc
失败,是不安全的。参见 Does realloc overwrite old contents?
ptr2
不受 ptr1
.
是的,ptr2
不受 realloc()
的影响,它与 realloc()
调用没有任何关系(根据当前代码)。
但是,FWIW,根据 realloc()
的 man page,(强调我的)
The realloc() function returns a pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr,
ptr1
可能会被更改。
也就是说,
ptr1 = realloc(ptr1, 3);
风格很危险。如果 realloc()
失败,
The realloc() function returns .... or NULL if the request fails
和
If
realloc()
fails the original block is left untouched; it is not freed or moved.
但是,根据您的陈述,在失败的情况下,NULL
return 将覆盖实际内存,丢失实际内存并造成内存泄漏。
如果内存可用,则堆 realloc 会分配它。 如果不是,它就像 malloc 一个新大小的块,它在那里 memcpy 你的内容。