【问题标题】:C array char* completly free memory during executionC 数组 char* 在执行期间完全释放内存
【发布时间】:2019-02-18 16:55:08
【问题描述】:

我想了解为什么这个脚本不能完全释放他的内存分配。 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();

【问题讨论】:

    标签: c winapi char malloc free


    【解决方案1】:

    这里:

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

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

    大概,您想将字符串的内容复制到分配的空间中,而不是覆盖指向空间的指针。为此,您需要strcpy()

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

    【讨论】:

    • "you want strcpy()" - strncpy() 会更安全,除非你使用 strlen()+1 作为 calloc() 的长度而不是使用硬编码32.
    • Waouh,你非常好 :) 如此之快 :DI 没有看到我在这些指针覆盖最终犯了错误...我正在学习 C,是的,我已经原谅了错误测试此示例中有两个 calloc。我通常用strlen完成len,而不是硬编码的32。取而代之的是strcpy,我尝试使用memcpy。非常非常感谢!它有效;)
    • 使用strncpy 几乎没有任何安全性。它只是exchanges one buffer overrun with a different one。如果您的编译器支持,请选择 strncpy_s
    • 如果使用得当strcpy()strncpy()strcpy_s()strcat()、@中的任何 987654337@,以及其他各种安全地将字符串的内容复制到足够大的缓冲区并确保其终止。正确使用的细节和复杂性在这些方面有所不同,毕竟缓冲区不够大时的选项和行为也是如此。其中一些在特定情况下会比其他更合适,但我拒绝在一般意义上比其他更安全的主张。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多