访问结构中的列表时出现分段错误

时间:2011-04-02 08:30:29

标签: c++ list struct malloc segmentation-fault

我会尽力说清楚。

这是我的结构:

struct scopeList{
       int id;
       list<int> internal_list;
};
typedef struct scopeList scopeList_T;

以下是给我分段的代码。

int main(){
    scopeList_T* t1 = (scopeList_T*) malloc(sizeof(scopeList_T));
    t1->id = 5; //works fine
    t1->internal_list.push_front(5); //segmentation fault
} 

由于我正在分配内存并且访问id很好,为什么这会给我一个分段错误?我是否必须先在列表中做一些特别的事情?

谢谢!

5 个答案:

答案 0 :(得分:5)

使用new代替malloc

sopeList_T* t1 = new scopeList_T;

malloc不运行任何构造函数。如果您需要发布struct,请使用delete而不是free - 您无法使用free {和new分配free个对象不会调用析构函数。)

您也不需要typedef,struct声明就足够了。

struct scopeList {
    int id;
    list<int> internal_list;
};

int main()
{
    scopeList *t = new scopeList;
    ....
    delete t;
    ....
}

答案 1 :(得分:1)

您不使用构造函数初始化列表,因此会在internal_list的位置留下无效数据。

答案 2 :(得分:1)

由于malloc不会调用构造函数,因此您需要执行以下两种方法之一:

  1. 使用new分配内存以及构造对象:

    sopeList_T* t1 = new scopeList_T;//it allocates and then call the ctor!
    
    //use delete to deallocate the memory
    delete t1;
    
  2. 或者使用malloc分配您正在执行的内存,并使用 placement new构建对象:

    scopeList_T* t1 = (scopeList_T*) malloc(sizeof(scopeList_T)); //allocation
    t1 = new (t1) scopeList_T; //it calls the ctor 
    
    //use free to deallocate the memory
    t1->~scopeList_T(); //call the destructor explicitly - necessary!
    free(t1);
    

答案 3 :(得分:1)

分配内存是不够的。 您还必须调用构造函数。

C ++中最常见和推荐的简单动态分配方法是

scopeList_T* t1 = new scopeList_T;

分配内存然后调用constuctor。

完成结构后,你必须删除像这样的对象

delete t1;

添加

如果你真的需要使用其他内存分配器(比如malloc / free或者你自己设计的东西),那么你必须分配内存并调用placement new(就像显式调用constuctor一样)。完成对象后,必须显式调用析构函数,然后释放内存。重要的是:为对象分配的内存必须满足此对象类型的对齐要求。

示例:

// allocating memory
void* p = my_alloc( sizeof(scopeList_T) );

if( p == NULL )
{
// report allocation error and throw or return
}

// placement new operator
scopeList_T* t1 = new(p) scopeList_T; // t1 == p

// do some thing with the object
// .............................

// call destructor explicitly
t1->~scopeList_T();
// free memory
my_free(p); // or free(t1); that is the same

答案 4 :(得分:1)

上面给出了正确的答案:您已经分配了结构的内存,但没有为未初始化状态的子对象运行任何构造函数。我必须坚持:这绝对不行。切勿混淆alloc&amp;有C ++代码的公司。