2016-08-24 118 views
-4

我有这样的代码:的realloc()会导致段错误

Perro **obj = NULL; 

obj = (Perro**)malloc(10*sizeof(Perro*)); 


for (int i = 0; i < 10; i++) 
{ 
    obj[i] = new Perrito((char*)"d",i); 
} 

realloc(obj,12*sizeof(Perro*)); 


for (int i = 9; i < 12; i++) 
{ 
    obj[i] = new Perrito((char*)"d",i); 
} 

for (int i = 0; i < 12; i++) 
{ 
    Perrito *p; 
    p = (Perrito*)obj[i]; 
    cout << p->getEdad() << endl; 
} 

当我看到我的对象我看到内存转储(分段故障)错误。 当我将realloc行注释掉并减少最后一个长度的项目时,它正常工作,但我需要使用realloc来增加我的polifirmist对象长度。

+6

想都别想使用'realloc的()'与'new'分配的事情 - 请使用'new'和'delete'或...实际上,如果你正在学习C++,现在是忘记所有关于'malloc()','realloc()','free()'等的好时机。使用'new'和'delete'。只要!也就是说,如果你不能使用'vector '或类似的东西。 '(char *)“d”'casts也是令人担忧的。构造函数可能需要一个'const char *'(这会使得演员不相关),或者你应该使用'const_cast (“d”)'来表示你正在做的演员的类型 - 但你不需要要做到这一点。 –

+2

他对'malloc'分配的东西使用'realloc'。他只将'obj'传递给'realloc','obj'只包含普通的指针。 (我赞同演员表。) –

+1

使用矢量,不要使用新的和删除。停止使用C风格的演员。 –

回答

2
obj = realloc(obj,12*sizeof(Perro*)); 

指针在realloc后会改变!

+2

是的,但只是问题的一部分。问题的一个重要部分。代码从第一个分配循环中泄漏'obj [9]'。我怀疑还会有其他泄漏,但清理代码没有显示。使用“矢量”将解决许多问题。 –

+1

如果'realloc'失败,这行代码会导致内存泄漏。 – immibis

+0

为什么!一个SAW,表明0我意味着OBJ [0]总是会返回0或NULL指针,并且我会几乎失去10个FIST的POSICITONS!为什么以及我应该如何处理这些问题! –

0

SHOOULD更好,如果我....

Perro *obj[40]; 

perro[0] = new Perrito; 
Perro[1] = new PerritoOther; 
... 
Perro[39]... 

THEN IF THE USER WHAT TO ADD OTHER THINGS 
MY TEACHER SAID YOU MUST USE REALLOC ?! WHY,WHAT CAN I DO ?