2011-10-06 7 views
5

Qualcuno può dirmi perché ottengo "Posizione di lettura violazione accessi" con questo esempio di codice? E come posso risolvere questo?Perché viene visualizzato un errore "Accesso alla violazione della posizione" con questo codice?

#include <vector> 
using namespace std; 
struct StructTest; 
struct Struct1; 
typedef struct Struct1{ 
    StructTest* test; 
} Struct1; 

typedef struct StructTest{ 
    vector<Struct1*> test123; 
} StructTest; 

static StructTest* abc; 

int test(){ 
    abc = (StructTest*) malloc(sizeof(StructTest));; 
    Struct1* a1 = (Struct1*) malloc(sizeof(Struct1)); 
    a1->test = abc; 
    abc->test123.push_back(a1); 
    return 0; 
} 

int main(){ 
    test(); 
    return 0; 
} 
+0

Quale riga causa l'errore? –

+0

+1 per una domanda ben fatta ([sscce] (http://sscce.org)) – Flexo

risposta

4

Sta crollando su questa linea:

abc->test123.push_back(a1); 

Il motivo è perché si alloca è due righe di cui sopra usando malloc. Pertanto, i contenuti di test123 non sono inizializzati. Quindi si blocca quando si chiama push_back su di esso.

+0

Grazie per la rapida risposta, come posso risolvere questo problema? – tandaica0612

+0

Usa 'new StructTest' invece di' malloc (sizeof (StructTest)) '. Lo stesso vale per l'altro 'malloc' use' new' invece. – Mysticial

6

Non è stato creato test123. Assegna le strutture con new anziché malloc e questo creerà per te test123.

abc = new StructTest; 
Struct1* a1 = new Struct1; 

Ricordarsi di smaltire con delete piuttosto che free.

Infatti, poiché si utilizza C++, è sufficiente smettere di usare malloc.

1

Non utilizzare malloc, utilizzare nuovo. malloc non causa la chiamata dei costruttori, quindi in questo caso il vettore non è un oggetto valido.

0

Perché, quando si assegna un blocco a "malloc", può contenere spazzatura, zeri o altro.

L'oggetto test123 è un oggetto C++, il cui costruttore non è stato eseguito. Prova invece a utilizzare l'operatore new.

Inoltre, mentre siamo sull'argomento, in C++, non c'è bisogno di strutture typedef, diventeranno automaticamente nomi di prima classe.

Problemi correlati