即使以前分配了释放的指针,也不会分配

Pointer being freed was not allocated even though it was allocated before

本文关键字:分配 指针 释放      更新时间:2023-10-16

我有错误,说对象0x7ffbaf002000的错误:被释放的指针未被分配。但是我已经打印出了内存地址,并且确实在 0x7ffbaf002000 之前分配了它,当flight[0] = (Flight*) malloc(sizeof(Flight) * 60)时循环内的函数allocFlights(Flight**, int)中分配了它。因此,我在函数deAllocFlights(Flight**, int)中的std::cout << flight[0] << std::endl上打印出存储地址,以查看它是否存在,并在> 0x7ffbaf002000 内部的内存地址

我不明白为什么有这个问题。我仍然是C 的新手。

这是结构飞行:

typedef struct {
    int flightNum;
    char origin[20];
    char destination[20];
    Plane *plane;
}Flight;
void getAllFlights(Flight **flight) {
    FILE *file = fopen("reservation.txt", "r");
    int i = 0, totalFlights;
    if(file == NULL)
    {
        perror("Error in opening file");
    }
    fscanf(file, "%dn", &totalFlights);
    *flight = (Flight*) malloc(sizeof(Flight*) * totalFlights);

    allocFlights(flight, totalFlights);  // Allocate here
    .
    .
    .
    deAllocFlights(flight, totalFlights);  // Error: Deallocate here
    fclose(file);
}

功能slocflights

void allocFlights(Flight **flight, int totalFlights) {
    for (int i = 0; i < totalFlights; i++) {
        flight[i] = (Flight*) malloc(sizeof(Flight) * 60);
        std::cout << flight[i] << " " << i << std::endl;  // Print out memory address
    }
}

功能deallocflights

void deAllocFlights(Flight** flight, int totalFlights) {
    for (int i = 0; i < totalFlights; i++) {
        std::cout << flight[i] << " " << i << std::endl; // Print out memory address
        free (flight[i]);
    }
}

主:

int main() {
    Flight *flight;
    getAllFlights(&flight);
    free(flight);
    return 0;
}

您正在两次交易您的第一个航班。因此,您第二次对其进行分配时,该系统告诉您它没有被分配,因为尽管已分配了它,但也被划分了。您无需在末尾致电free(flight);,因为您已经在deAllocAllFlights()中汇总了所有航班。正如大卫·施瓦茨(David Schwartz)在评论中提到的那样,这是因为flight[0]*flight相同(或者他认为*(flight + 0))。

到处都缺少一颗星星。

代码与原始变量一起用作Flight的指针数组(或指向Flight指针的指针)。因此,必须用双星来定义它:

int main() {
    Flight **flight;
    getAllFlights(&flight);
    free(flight);
    return 0;
}

且每个功能都相同:

void getAllFlights(Flight ***flight) {
    ...
    *flight = (Flight**) malloc(sizeof(Flight*) * totalFlights);
void allocFlights(Flight ***flight, int totalFlights) {
    for (int i = 0; i < totalFlights; i++) {
        // dereference the pointer first and then access array:
        (*flight)[i] = (Flight*) malloc(sizeof(Flight));
void deAllocFlights(Flight*** flight, int totalFlights) {
    for (int i = 0; i < totalFlights; i++) {
        std::cout << (*flight)[i] << " " << i << std::endl; // Print out memory address
        // dereference the pointer first and then access array
        free ((*flight)[i]);

原始代码直接访问了main函数中定义的变量的指针,并将其用作数组,这意味着它进入了索引1的变量背后的地址,甚至具有更高的索引。

还要注意,flights是变量和所有其他参数的更好的名称,因为它实际上是数组。这将使代码更加清晰,并有可能提供更好的机会避免这样的错误。