“Ошибка шины” при доступе к набору<int> из структуры
Вопрос
Искал некоторое время, но я не могу понять, почему это может вызвать ошибку шины.
Мы были бы очень признательны за любую помощь.
typedef struct {
set<int> pages;
} someStruct;
...
void someFunction() {
...
someStruct *a = createSomeStruct(); // just mallocs and returns
a->pages.insert(5);
...
}
Решение
malloc не инициализирует выделяемую память.попробуйте с новым.
Другие советы
Можно инициализировать набор, если вам действительно нужно использовать malloc по какой-то причине:
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;
}
Обратите также внимание, что "ошибка шины" обычно означает "несогласованное чтение из памяти". То есть попытка загрузить int32 с адреса 0x1001 вызовет ошибку шины на многих архитектурах (поскольку операция загрузки 32-битного слова ожидает выровненный адрес).Обычно это выдает, что вы пытаетесь разыменовать поддельный указатель.
Морис явно определил основную причину проблемы здесь, но мысль "ошибка шины" -> "фиктивный указатель" может помочь отследить подобные вещи в будущем.