linux中的地址分配:可能超过一圈?

时间:2013-03-13 19:55:45

标签: linux memory overlapping

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

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

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中移植它就是这个问题......

谢谢!

3 个答案:

答案 0 :(得分:1)

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

如果您要发布您的代码以及您获得的实际错误,我们可能会发现这一点。事实上,invalid free的深层问题无法解决。

它可能关注谁,这是答案还是评论?

答案 1 :(得分:1)

  1. sizeof(double)为8个字节,sizeof(double*)为4个(在32位系统上)。
  2. malloc获得的内存不会重叠,除非在此期间释放。
  3. 使用内存调试程序,例如valgrind

答案 2 :(得分:0)

它看起来那样......你是如何最终得到这些指针的?原则上可以让不同的指针指向同一个空间 - 除了指向malloc(或calloc)的指针之外,你不应该“释放”。 glibc实际上保留了一些“正好位于指针下方”的数据,告诉它块有多大等等,所以它可以“干净利落”。如果更改指针的值,则不能“释放块的一部分”,因为有关块的大小的信息不可用(仅当指针未更改时)。这可能是你问题的根源吗?