写了我的包装realloc
。一切都在这里吗?也许有一些我没有注意到的缺陷?
#define qk_realloc(p, n) qk_realloc__(p, &p, n)
/*
=================================
[TEST] The qk_realloc__ function
Функция изменяет размер блока памяти,
на который указывает old. Если операция
выполнена успешно, то old присваивается
адрес нового блока памяти. Если операция
не выполнилась, в куче выделяется НОВЫЙ
блок памяти, в него копируется содержимое
old, старые данные освобождаются и указателю
old присваевает адрес нового блока памяти.
Если память не может быть выделена и для
нового блока, функция возвращает NULL,
при этом входные данные не изменяются.
=================================
*/
void* qk_realloc__(void* old, void* const ptrToOld, const u32 n) {
void* new = realloc(old, n);
if (new != NULL) {
return *((void**) ptrToOld) = new;
}
// Тут должно быть сообщение типа: "не удалось выполнить realloc(n)".
new = qk_malloc(n);
if (new != NULL) {
memmove(new, old, n);
free(old);
return *((void**) ptrToOld) = new;
}
// И тут похожее сообщение...
return NULL;
}
这个shell的开发者逻辑完全不清楚
为什么
old
指向old
(ptrToOld
) 的指针同时传递给函数?如果你真的想通过ptrToOld
,那么你可以从中获得价值old
。为什么要old
分开转让?为什么是无条件的
memmove(new, old, n);
?如果新尺寸比旧尺寸大怎么办?此外,标准realloc
允许您将空指针作为输入传递给它。你memmove
的没有考虑到这种可能性。为什么
ptrToOld
会有这么奇怪的类型——void* const
?为什么这种类型不是指向指针的指针?为什么你决定失败后
realloc
你可以做到malloc
?从理论上讲,失败realloc
可能会有所不同,但我们知道失败几乎总是realloc
只是缺乏记忆。为什么你认为如果realloc
他不能分配内存,那么他malloc
可以?*((void**) ptrToOld)
- 内存重新解释,严格混叠违规是可能的。为什么
memmove
不memcpy
呢?你到底想达到什么目的?第一个想法是,这个 shell 旨在处理变体的缺点
p = realloc(p, ...)
,但它并没有以任何方式处理它们。那么有什么意义呢?都错了。首先是不需要环绕完善的标准功能。
我什至不会看你的代码,回答一个简单的问题:为什么?