首页 > 解决方案 > 如何正确重用分配的指针,因为错误“双重释放或损坏(!prev)”

问题描述

我编写了以下代码以sqlite3迭代方式进行一些查询,但出现了错误double free or corruption (! prev)

struct Arr{
 int length;
 int *arr_;
};

void getValues(sqlite3 conn, struct Arr arr1, struct Arr arr2, int *values){
    int i, j, k;
    int state, nrow, ncolumn;
    char **res;
    char *err_msg = 0;
    // to build query like "select * from table1 where value1 in (1,2,3...) and value2 = 100;"
    char *query = malloc(sizeof(char) * (arr1.length * 10 + 200);
    for(i=0l i<arr1.length; i++){
        strcpy(query, "select * from table1 where value1 in (");
        for(j=0; j<arr2.length; j++){
            char buffer[sizeof(char) * (int)(ceil(log10(arr1.arr_[j]+1)))];
            sprintf(buffer, "%d", arr1.arr_[j]);
            strcat(query, buffer);
            if(j == arr1.length - 1){
                strcat(query, " ) and values2 = ");
                char buffer_[sizeof(char) * (int)(ceil(log10(arr2.arr_[i]+1)))];
                sprintf(buffer_, "%d", arr2.arr_[i]);
                strcat(query, buffer_);
                strcat(query, ";");
            }else
                strcat(query, " , ");
        }
        printf("query: %s\n", query);
        state = sqlite3_get_table(conn, query, &res, &nrow, &ncolumn, &err_msg);
        sprintf(query, '\0');
    }
    free(query)
}

事实证明,查询可以正确打印,但是在打印所有查询后,错误double free or corruption (! prev)已经出现,即使我评论state = sqlite3_get_table(conn, query, &res, &nrow, &ncolumn, &err_msg);仍然存在相同的错误。

我认为,

  1. buffer,并且buffer_不需要是免费的,所以应该没有问题

  2. 也许sprintf(query, '\0');或'查询='\ 0';was not a good idea to set the query to NULL, but allocatingchar *query inside offor andfree(query)` 对于应用程序来说不是必需的,不知道是否有必要避免分配错误。任何人都知道如何正确地做到这一点?提前致谢。

标签: clinuxmemorymemory-leaksmalloc

解决方案


我发现了问题。事实证明,分配给的内存query是不够的。char *query = malloc(sizeof(char) * (arr1.length * 10 + 200);,这里的arr1.length * 10,意味着为 中的每个元素分配 10 个块arr1.arr_。但是添加了一个,(strcat(query," , ");) ,所以10+1每个数字都需要比块(在现实生活中,添加了 15 个以上的字符,而不是我在这里写的示例中的 1 个,所以造成了很大的问题)。

因此,不仅要检查分配变量的方式,还要检查分配单元的长度。


推荐阅读