我正在尝试检查我的程序是否正确分配内存 -
所以我有一系列不同类型的指针,
pData1 = 0x844c458(malloc的结果(5 *大小为(double *))
pData2 = 0x844c470(malloc的结果(10 大小为(double ));
pData3 = 0x844c3a0(malloc的结果(44 * size 0f(double *));
pData4 = 0x844c358
所以我认为double = 8个字节,5 * 8 = 40个字节,这意味着前两个地址将重叠,同样地说是两个地址?
我的免费无效,所以我正在调查我的代码中的内存损坏,所以试图找到这可能发生的地方。
-----编辑-------添加代码详细信息
这是结构 -
struct _ELEMENT
{
short s;
char arr[20];
int size;
void *ptr1;
void *ptr2;
}ELEMENT;
有两个类Parent和Derived(Parent的子级)
Class Parent
{
protected:
int size;
ELEMENT *ele1;
ELEMENT *ele2;
public:
void func();
...
}
Class Child::public Parent
{
int a,b,c;
}
Parent::Parent()
{
ele1 = NULL;
ele2= NULL;
}
Parent::~Parent()
{
for (int i =0; i< size; i++)
{
free(ele1[i].p1);
free(ele2[i].p1);
}
free(ele1);
free(ele2);
}
Child::Child()
{
a=0;...
}
Child::~Child()
{
for (int i =0; i< size; i++)
{
free(ele1[i].p1);
free(ele2[i].p1);
}
free(ele1);
free(ele2);
}
Parent::func ()
{
ele1 = (ELEMENT*)malloc (n * sizeof(ELEMENT));
ele2 = (ELEMENT*)malloc (n* sizeof(ELEMENT));
for (int i =0; i <somenumber; i++)
{
...some processing...
ele1[i].size = n;
ele2[i].size = x;
ele1[i].p1 = malloc (ele1[i].size);
ele2[i].p1 = malloc(ele2[i].size);
}
}
main ()
{
Parent *p;
CHild *c;
p = new Parent();
c= new Child();
p->func();
c->func();
delete(p);
delete(c);
}
_glibc:无效免费首先免费提供父析构函数。这段代码在SOlaris中运行良好多年,但在linux中移植它就是这个问题......
谢谢!
答案 0 :(得分:1)
您的问题的答案是您的程序正确分配内存,您遇到的第一个问题是您不知道数据类型的大小,因此您的计算不正确。
如果您要发布您的代码以及您获得的实际错误,我们可能会发现这一点。事实上,invalid free
的深层问题无法解决。
它可能关注谁,这是答案还是评论?
答案 1 :(得分:1)
sizeof(double)
为8个字节,sizeof(double*)
为4个(在32位系统上)。malloc
获得的内存不会重叠,除非在此期间释放。答案 2 :(得分:0)
它看起来那样......你是如何最终得到这些指针的?原则上可以让不同的指针指向同一个空间 - 除了指向malloc
(或calloc
)的指针之外,你不应该“释放”。 glibc实际上保留了一些“正好位于指针下方”的数据,告诉它块有多大等等,所以它可以“干净利落”。如果更改指针的值,则不能“释放块的一部分”,因为有关块的大小的信息不可用(仅当指针未更改时)。这可能是你问题的根源吗?