“Ошибка шины” при доступе к набору<int> из структуры

StackOverflow https://stackoverflow.com/questions/601680

  •  03-07-2019
  •  | 
  •  

Вопрос

Искал некоторое время, но я не могу понять, почему это может вызвать ошибку шины.

Мы были бы очень признательны за любую помощь.

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-битного слова ожидает выровненный адрес).Обычно это выдает, что вы пытаетесь разыменовать поддельный указатель.

Морис явно определил основную причину проблемы здесь, но мысль "ошибка шины" -> "фиктивный указатель" может помочь отследить подобные вещи в будущем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top