2015-07-25 3 views
5

Strano comportamento in IOS durante l'integrazione con una libreria c/C++.IOS rimuove la memoria allocata nella libreria nativa

In AppDelegate io chiamo

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{ 
    [[ABCService sharedInstance] abcInitialize]; 
}); 

abcInitialize è definito nella libreria C++

struct abc *top; 
top = calloc(TYPE_SERV,size_of(struct abc)); 
top->us = server_alloc (...certain_params...); 

all'interno di allocazione di server faccio allocazione di strutture struct1 e struct2 e poi in funzione Initialize i prova ad accedere a

top->us = calloc(TYPE_US, size_of(struct us)); 
if(top->us->struct1) //do something 

ho notato che il mio struct1 è sempre nullo

Quando sono il debug, posso vedere che la struttura è stata allocata fine e valori sono impostati in modo appropriato, ma prima di ritornare dalla funzione, la memoria si rilascia automaticamente. Questo è totalmente confuso e fastidioso. Qualcuno potrebbe aiutarmi a capire cosa sta succedendo?

ho provato spegnendo ARC troppo, ancora nessun cambiamento

+0

È necessario mostrare come viene allocata struct1 e come viene dichiarata. – bbum

+0

stuct1 viene assegnato come calloc (1, stuct1_size); – blganesh101

+0

Immagino sia necessario mostrare come abcInitialize: è come. Perché nel tuo codice attuale non si alloca memoria per il puntatore 'top' ma si assegna qualcosa al membro' us' (top-> us = ...). –

risposta

7
top->us = calloc(TYPE_US, size_of(struct us)); 
if(top->us->struct1) //do something 

ho notato che il mio struct1 è sempre nullo

Se questo è il tuo vero codice, allora sì, struct1 sarà sempre nullo. calloc alloca la memoria e la inizializza a zero. Quindi, tutti i dei membri di top->us sarà zero e poiché struct1 è un membro di top->us, sarà pari a zero, ovvero NULL.

+0

struct1 è allocato. Questo non è il vero codice. Il codice reale funziona su tutte le piattaforme e non vengono apportate modifiche per IOS – blganesh101

4

Prima di tutto, ARC non ha nulla a che fare con la gestione della memoria dei codici C o C++, quindi, è possibile escludere ARC per ciò.

Secondo http://www.cplusplus.com/reference/cstdlib/calloc/, calloc inizializza sempre tutti i bit della memoria allocata su 0, naturalmente, top-> us-> struct1 sarà NULL.

ma prima di tornare dalla funzione, la memoria è automaticamente deallocata

Come si arriva alla conclusione che la memoria sia deallocata automaticamente? Come accennato in precedenza, ARC non rilascerà automaticamente la struttura/oggetto C++.

In conclusione. Il risultato che hai visto era davvero come previsto.

+0

Quando eseguo il debug, la memoria viene allocata correttamente e ho potuto vedere i valori della struttura intatti., Al ritorno della funzione, la stessa struttura viene de-allocata. Mi chiedo perché questo strano comportamento. – blganesh101

0

Ho trovato il problema ed era dovuto collegare lo stesso file due volte da una libreria diversa. Ho corretto le mie librerie e questo ha risolto il problema. Quindi nessun codice sorgente è stato aggiornato. Solo le libs sono state corrette con le giuste fonti. Grazie mille per il vostro supporto.