C数组char *在执行期间完全释放内存

C array char* completly free memory during execution

我想了解为什么这个脚本没有完全释放他的内存分配。 windows 内存使用图表比这些大约 400Mb 的总分配量略有下降。 所有内存都是免费的 int 数组,但不是 char*

数组

怎么做才对?非常感谢您的帮助...

void testAlloc() {
unsigned char error = 0;
char **arr;
char **buf;
size_t size = 1;
size_t idx = 0;
size_t nextIdx;
size_t newSize;

arr = calloc(size, sizeof(char*));

while(idx < 9999999) {
    nextIdx = idx+1;
    newSize = nextIdx*2;
    if(nextIdx > size) {
        buf = realloc(arr, newSize * sizeof(char*));
        if(buf != NULL) {
            arr = buf;
            size = newSize;
            }else{
                error = 1;
                }
        }
    if(!error) {
        arr[idx] = calloc(32, sizeof(char));
        arr[idx] = "sample text";
        }
    idx++;
    }

MessageBox(NULL, "stop before free", "", MB_OK);

size_t i = 0;
if(!error && arr != NULL) {
    while(i < idx) {
        free(arr[i]);
        i++;
        }
    free(arr);
    arr = NULL;
    }
}
testAlloc();

这里:

        arr[idx] = calloc(32, sizeof(char));
        arr[idx] = "sample text";

您正在分配 32 个字节的内存并将指向它们的指针存储在 arr[idx] 中,然后您将用指向由字符串文字表示的数组的指针覆盖该指针。动态分配被泄露。此外,稍后当您尝试释放数组元素指向的 space 时会调用未定义的行为,因为当时存储在数组中的指针不是从任何分配函数中获得的。

据推测,您希望将字符串的内容复制到分配的 space,而不是覆盖指向 space 的指针。为此,您需要 strcpy().

        arr[idx] = calloc(32, sizeof(char));
        // Note: an error check really ought to be performed here
        strcpy(arr[idx], "sample text");