0

搜索了一段时间,但我无法弄清楚为什么这会引发总线错误。

任何帮助将非常感激。

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

3 回答 3

9

malloc 不会初始化它分配的内存。尝试新的。

于 2009-03-02T09:01:58.890 回答
2

如果出于某种原因确实必须使用 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;
}
于 2009-03-02T09:16:26.907 回答
1

另请注意,“总线错误”通常意味着“未对齐的内存读取”。也就是说,尝试从地址 0x1001 加载 int32 会在许多架构上导致总线错误(因为 load-32-bit-word op 需要对齐的地址)。这通常是您试图取消引用虚假指针的赠品。

Maurice 已经清楚地确定了问题的主要原因,但是考虑“总线错误”->“虚假指针”可以帮助在未来追踪这类事情。

于 2009-03-02T09:16:20.400 回答