Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux中的地址分配:可能在lap上?_Linux_Memory_Overlapping - Fatal编程技术网

linux中的地址分配:可能在lap上?

linux中的地址分配:可能在lap上?,linux,memory,overlapping,Linux,Memory,Overlapping,我正在检查我的程序是否正确分配内存- 我有一系列不同类型的指针 pData1=0x844c458(malloc的结果(5*大小的(双*)) pData2=0x844c470(malloc的结果(10倍大小) pData3=0x844c3a0(malloc的结果(44*尺寸0f(双*)) pData4=0x844c358 所以我认为double=8字节,5*8=40字节,这意味着前两个地址会重叠,后两个地址也会重叠 我正在获得无效释放,因此我正在调查代码中的内存损坏,以便试图找到可能发生这种情况的

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

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

pData1=0x844c458(malloc的结果(5*大小的(双*))

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

pData3=0x844c3a0(malloc的结果(44*尺寸0f(双*))

pData4=0x844c358

所以我认为double=8字节,5*8=40字节,这意味着前两个地址会重叠,后两个地址也会重叠

我正在获得无效释放,因此我正在调查代码中的内存损坏,以便试图找到可能发生这种情况的地方

-----编辑------添加代码详细信息

这是结构-

struct _ELEMENT
 {
 short s;
 char arr[20];
 int size;
 void *ptr1;
 void *ptr2;
 }ELEMENT;
有两个类父类和派生类(父类的子类)

类父类
{ 
受保护的:
整数大小;
元素*ele1;
元素*ele2;
公众:
void func();
...
}
类子级::公共父级
{
INTA、b、c;
}
父::父()
{
ele1=NULL;
ele2=NULL;
}
父项::~Parent()
{
对于(int i=0;ifunc();
删除(p);
删除(c);
}
_glibc:invalid free一开始是免费的父析构函数。这段代码在SOlaris中运行了好几年,但在linux中移植它会带来这个问题


谢谢!

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

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

如果你想发布你的代码和你收到的实际错误,我们有可能解决这个问题。事实上,
无效免费
的深层次问题无法得到回答

这是对谁的回答还是评论

  • sizeof(double)
    是8字节,
    sizeof(double*)
    是4字节(在32位系统上)
  • 通过
    malloc
    获得的内存不会重叠,除非同时释放
  • 使用内存调试器,例如

  • 你认为双指针的大小是多少?正如所提出的,这不是一个真正可以回答的问题。我在下面的答案中加入了一些“一般想法”——但你真的应该试着发布一个实际的问题(“这是代码,这是指针的样子,这是怎么发生的?”)malloc获得的内存不会重叠-除非您同时释放。我询问的原因是x70-x58=x18(12月24日)和5*4=20,因此没有重叠。xc358是什么?它与xc3a0有什么关系?没有看到整个代码(如上所述)这里没有足够的答案。PS:为什么不让efence或valgrind为您做这项工作呢?请注意0x58+0x18与实际分配的内存量(0x14)之间的4字节差异。指针下方有数据
    …并且混淆了
    sizeof(double)
    sizeof(double*)
    @Axel-是的,这就是我所说的“不知道数据类型的大小”:)导致了与这两个大小的数据类型的混淆
    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);
    }