我有一个错误,指出对象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/