& # 8220; Erreur de bus & # 8221; accès à un ensemble < int > à partir d'une structure
Question
J'ai cherché pendant un moment, mais je ne comprends pas pourquoi cela provoquerait une erreur de bus.
Toute aide serait très appréciée.
typedef struct {
set<int> pages;
} someStruct;
...
void someFunction() {
...
someStruct *a = createSomeStruct(); // just mallocs and returns
a->pages.insert(5);
...
}
La solution
malloc n'initialise pas la mémoire allouée. essayez avec nouveau.
Autres conseils
Il est possible d'initialiser l'ensemble, si vous devez réellement utiliser malloc pour une raison quelconque:
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;
}
Notez également que "" erreur de bus" " signifie généralement "lecture mémoire mal alignée". C'est-à-dire qu'essayer de charger un int32 à partir de l'adresse 0x1001 provoquera une erreur de bus sur de nombreuses architectures (car le mot load-32-bit attend une adresse alignée). C'est généralement un cadeau que vous essayez de déréférencer un pointeur factice.
Maurice a clairement indiqué la cause première du problème ici, mais en pensant "erreur de bus" - > "Pointeur factice" peut aider à suivre ce genre de chose dans le futur.