2016-08-24 122 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 ?