我会尽力说清楚。
这是我的结构:
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很好,为什么这会给我一个分段错误?我是否必须先在列表中做一些特别的事情?
谢谢!
答案 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
不会调用构造函数,因此您需要执行以下两种方法之一:
使用new
分配内存以及构造对象:
sopeList_T* t1 = new scopeList_T;//it allocates and then call the ctor!
//use delete to deallocate the memory
delete t1;
或者使用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 ++代码的公司。