即使以前分配了释放的指针,也不会分配
Pointer being freed was not allocated even though it was allocated before
我有错误,说对象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
是变量和所有其他参数的更好的名称,因为它实际上是数组。这将使代码更加清晰,并有可能提供更好的机会避免这样的错误。
- 通过双指针分配指针
- 在不工作的情况下为数组分配指针,但反过来也可以
- 无法使用"std::make_shared"分配指针
- 分配指针时出现分段错误
- 为什么有时仅使用Ampersand运算符在C 中分配指针
- 重新分配指针阵列的一部分的安全方法
- 为什么在执行增量操作之前分配指针值
- 当指针指向的对象被另一个类的实例删除时,重新分配指针
- 在堆上分配指针的原因是什么?
- 有没有办法防止分配指针?
- 将运算符重写应用于具有动态分配指针的类
- 在堆上分配指针数组
- 在另一个结构中的结构内解除分配指针
- 分配指针后,是否可以为指针指向的事物分配变量名称?
- 重新分配指针后,将类功能与指针一起使用
- 为什么我的新分配指针会自动在程序退出上删除
- 分配指针的方法之间有什么区别?
- 如何声明和分配指针
- 内存分配(指针和堆栈)
- 通过参数分配指针的值