我定义了一个包含std :: list的结构。在我的代码中,我尝试迭代这个列表,但是我得到了一些奇怪的结果。
struct my_struct_t {
std::list<int> my_list;
//More fields
};
这是我的头文件中定义的结构。
包含此标题的文件中的一些示例代码将是:
std::list<int>::iterator my_iterator;
struct my_struct_t* test_struct = (struct my_struct_t*) malloc(sizeof(struct my_struct_t));
my_iterator = test_struct->my_list.begin();
printf("Beginning of list address: %p\n", my_iterator);
my_iterator = test_struct->my_list.end();
printf("End of the list address: %p\n", my_iterator);
printf("Address of the list: %p\n", &(test_struct->my_list));
此代码编译并运行正常,但输出类似于:
Beginning of list address: (nil)
End of the list address: 0x86f010
Address of the list: 0x86f010
最后两行对我来说非常有意义,因为列表应该是空的。但是我如何/为什么我开始得到一个空指针?我该如何解决这个问题?
答案 0 :(得分:8)
您不能malloc
列表,然后在未初始化的情况下使用它。这是一个无效的操作。
尚未使用正确的new
调用进行初始化。这一点在没有吹出段错误的情况下完全有效。
您需要使用C ++样式初始化创建my_struct_t
对象,否则它将无效。
您是否尝试过更多类似C ++的内容:
struct my_struct_t* test_struct = new my_struct_t;
稍后您将free
拨打delete
来代替{{1}}。
答案 1 :(得分:1)
malloc
只会为对象分配必要的内存,但不会初始化该对象。 C ++中对象的初始化由其构造函数执行。 C ++为运算符new
提供了分配内存和同时初始化对象的能力。所以你应该做的是:
my_struct_t* x = new my_struct_t();
如果你真的打算在这里使用malloc
,你仍然可以使用placement new
在正确对齐的原始内存中正确初始化对象。请记住,您必须显式调用析构函数并显式释放内存。但我很怀疑这是你的意图。