“Erro de barramento” acessar um conjunto de uma struct
Pergunta
Procurado por um tempo, mas eu não consigo descobrir por que isso iria levantar um erro de bus.
Qualquer ajuda seria muito apreciada.
typedef struct {
set<int> pages;
} someStruct;
...
void someFunction() {
...
someStruct *a = createSomeStruct(); // just mallocs and returns
a->pages.insert(5);
...
}
Solução
malloc não inicializar a memória que ele aloca. tente com o novo.
Outras dicas
É possível inicializar o conjunto, se você realmente tem que usar malloc por algum 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;
}
Note também que "erro de bus" geralmente significa "memória desalinhado ler." Ou seja, tentar carregar um int32 do endereço 0x1001 irá causar um erro de bus em muitas arquiteturas (porque a-32-bit palavra de carga op espera um endereço alinhado). Isso é geralmente uma oferta que você está tentando excluir a referência um ponteiro falso.
Maurice tem claramente pregado a causa primária do problema aqui, mas o pensamento "erro de bus." -> "ponteiro falso" pode ajudar a controlar esse tipo de coisa para baixo no futuro