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