& # 8220; Errore bus & # 8221; accedere a un set < int > da uno struct
Domanda
Ho cercato per un po ', ma non riesco a capire perché questo causerebbe un errore del bus.
Qualsiasi aiuto sarebbe molto apprezzato.
typedef struct {
set<int> pages;
} someStruct;
...
void someFunction() {
...
someStruct *a = createSomeStruct(); // just mallocs and returns
a->pages.insert(5);
...
}
Soluzione
malloc non inizializza la memoria che alloca. prova con nuovo.
Altri suggerimenti
È possibile inizializzare il set, se davvero devi usare malloc per qualche motivo:
typedef struct {
set<int> pages;
} someStruct;
...
void someFunction() {
...
someStruct *a = createSomeStruct();
a->pages.insert(5);
...
}
...
someStruct *createSomeStruct(void) {
someStruct *a = (someStruct *) malloc(sizeof(*a));
new(&a->pages) set<int>;
return a;
}
Nota anche che "errore bus" " di solito significa "disallineato memoria letta". Vale a dire, il tentativo di caricare un int32 dall'indirizzo 0x1001 provocherà un errore del bus su molte architetture (poiché l'operazione di caricamento a 32 bit prevede un indirizzo allineato). Di solito è un omaggio che stai cercando di dereferenziare un puntatore falso.
Qui Maurice ha chiaramente individuato la causa principale del problema, ma pensando "errore di bus" - > "puntatore fasullo" può aiutare a rintracciare questo genere di cose in futuro.