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);
   ...
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top