我有错误,说明对象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;
}
答案 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
是变量和所有其他参数的更好名称,因为它实际上是数组。这将使代码更清晰,并可能提供更好的机会来避免这样的错误。