我有一个错误,指出对象0x7ffbaf002000的错误:未分配指针。但是我已经打印出了内存地址,并且确实在allocFlights(Flight**, int)循环内的函数flight[0] = (Flight*) malloc(sizeof(Flight) * 60)中将其分配在0x7ffbaf002000之前。所以我在函数std::cout << flight[0] << std::endl中的deAllocFlights(Flight**, int)处打印出内存地址,看是否在循环内的0x7ffbaf002000那里

我不明白为什么会有这个问题。我还是C ++的新手。

这是struct Flight:

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, "%d\n", &totalFlights);
    *flight = (Flight*) malloc(sizeof(Flight*) * totalFlights);


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


函数allocFlights

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))。

关于c++ - 即使释放指针未分配,也未分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41072201/

10-09 00:28