«Ошибка шины» при доступе к набору <int>из структуры - PullRequest
0 голосов
/ 02 марта 2009

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

Любая помощь будет высоко ценится.

typedef struct {
   set<int> pages;
} someStruct;
...
void someFunction() {
   ...
   someStruct *a = createSomeStruct(); // just mallocs and returns
   a->pages.insert(5);
   ...
}

Ответы [ 3 ]

9 голосов
/ 02 марта 2009

malloc не инициализирует выделенную память. попробуй с новым.

2 голосов
/ 02 марта 2009

Можно инициализировать набор, если вам действительно нужно использовать 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;
}
1 голос
/ 02 марта 2009

Обратите внимание, что «ошибка шины» обычно означает «неправильное считывание памяти». То есть, попытка загрузить int32 с адреса 0x1001 вызовет ошибку шины во многих архитектурах (потому что операция load-32-bit-word ожидает выровненный адрес). Обычно это дешевая распродажа, которую вы пытаетесь разыменовать фальшивым указателем.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...