0

我正在尝试检查我的程序是否正确分配内存-

所以我有一系列不同类型的指针,

pData1 = 0x844c458 ( malloc 的结果 (5 * size of (double*))

pData2 = 0x844c470 (malloc 的结果 ( (double) 的 10 大小));

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:invalid free 最初没有父析构函数。此代码在 SOLaris 中运行良好多年,但将其移植到 linux 中会出现此问题...

谢谢!

4

3 回答 3

1
  1. sizeof(double)是 8 个字节,sizeof(double*)是 4(在您的 32 位系统上)。
  2. 获得的内存malloc不会重叠,除非同时释放。
  3. 使用内存调试器,例如valgrind
于 2013-03-13T20:13:00.863 回答
1

您的问题的答案是您的程序正确分配内存,您遇到/遇到的第一个问题是您不知道数据类型的大小,因此您的计算不正确。

如果您发布您的代码和您遇到的实际错误,我们可能会解决这个问题。事实上,invalid free无法回答的深层问题。

它可能关心谁,这是一个答案还是一个评论?

于 2013-03-13T20:08:15.620 回答
0

看起来是这样……你是怎么得到这些指针的?原则上,让不同的指针指向同一个空间是可以的——你只是不应该“释放”,除非是从一个用malloc(or calloc) 分配的指针。glibc 实际上保留了一些“就在指针下方”的数据,这些数据告诉它块有多大等,因此它可以“干净地”释放。如果更改指针的值,则不能“释放块的一部分”,因为有关块大小的信息不可用(仅当指针未更改时)。这可能是你问题的根源吗?

于 2013-03-13T19:58:57.570 回答