即使在

时间:2016-12-10 04:33:29

标签: c++ pointers

我有错误,说明对象0x7ffbaf002000的错误:释放的指针未分配。但是我打印出了内存地址,它确实在allocFlights(Flight**, int)之前在循环内的函数flight[0] = (Flight*) malloc(sizeof(Flight) * 60)中的 0x7ffbaf002000 之前分配。所以我打印出函数std::cout << flight[0] << std::endldeAllocFlights(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;
}

2 个答案:

答案 0 :(得分:2)

您已经两次取消首次飞行。因此,第二次取消分配时,系统会告诉您它尚未分配,因为尽管已分配,但系统也已取消分配。您最近不需要致电free(flight);,因为您已经在deAllocAllFlights()中取消分配了所有航班。正如David Schwartz在评论中所提到的那样,这是因为flight[0]*flight相同(或者他将其*(flight + 0))。

答案 1 :(得分:2)

到处都缺少一颗星。

代码使用原始变量作为指向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是变量和所有其他参数的更好名称,因为它实际上是数组。这将使代码更清晰,并可能提供更好的机会来避免这样的错误。