我有以下职能:
void deleteInventory( struct book** inventory )
{
struct book* ptr = NULL;
ptr = *inventory;
while( length != 0)
{
free(ptr);
length--;
++ptr;
}
free(inventory);
}结构:
#define MAX_LENGTH 64
#define ISBN_LENGTH 11
struct book
{
char isbn[ISBN_LENGTH];
char title[MAX_LENGTH];
char author[MAX_LENGTH];
int year;
float price;
};结构的总大小:147个字节 (11 + 64 + 64 +4+ 4) (Struct)返回的大小:148个字节
我的库存变量是结构数组,包含3条记录。
现在,函数中的调试结果(没有高2个字节的地址):
inventory[0] = 0x1350
inventory[1] = 0x14e0
inventory[2] = 0x1670内存差异: 400字节,好的
在第一次迭代时一切正常,第一次记录删除没有问题。
但之后
++ptr;ptr将包含:0x13e4
库存- ptr =148个字节-根据结构大小校正差异
但是它没有引用下一条记录,因为内存中的下一条记录的地址是:0x14e0和我得到堆的损坏。
有什么建议吗:为什么?
发布于 2013-12-10 19:35:23
我认为您从inventory中删除的内容不正确。在free(ptr)之后,ptr之后的下一个内存块可能是垃圾内存。在这里,我认为删除清单的正确方法是:
void deleteInventory( struct book** inventory )
{
book** i = inventory;
while( length != 0)
{
free(*i);
length--;
++i;//notice the difference (++i) instead of (++(*i))
}
free(inventory);
}发布于 2013-12-10 19:39:32
您已经说过inventory是一个数组,这很好。
您已经说过,book占用148个字节(当您计算填充时),这很好。
您没有说的是,您在inventory中放置的指针是一次性分配的,而您有一系列指针这一事实对我来说意味着它们不是。
不管您创建每个book,它似乎都是动态的。不能保证这些书是连续的,只有指向它们的指南针。
改变你的职能:
void deleteInventory( struct book** inventory )
{
struct book* ptr = NULL;
for (int i = 0; i < length; ++i) {
ptr = inventory[i];
free(ptr);
}
length = 0;
free(inventory);
}这将读取连续指针到book数组以删除所有book,而不假定book本身是连续分配的。
发布于 2013-12-10 19:39:42
我们只能推测inventory及其内容是如何存活的,但是由于您单独地释放了它们,您可能也有单独的malloc()d。但是,您可以通过ptr和ptr++来检查它们,它们假设连续分配的结构成员,就像数组中的情况一样。
但是,没有什么保证(平均实现也不会这样做) malloc()将以任何方式返回连续分配的连续存储。
这就是为什么您看到它们比预期的148个字节更多的原因。由于清单可能是分配的指针的数组,所以您要做的是:
while( length != 0)
{
free(*inventory);
length--;
++inventory;
}https://stackoverflow.com/questions/20503477
复制相似问题