0

我定义了一个包含 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

最后两行对我来说很有意义,因为列表应该是空的。但是我如何/为什么一开始就得到一个空指针?我怎样才能解决这个问题?

4

2 回答 2

8

你不能malloc一个列表然后在没有初始化的情况下使用它。这是一个无效的操作。

它尚未通过适当的new调用进行初始化。这在没有吹出段错误的情况下完全有效,这真是太棒了。

您将需要my_struct_t使用 C++ 样式初始化来创建对象,否则它将不起作用。

您是否尝试过更多 C++ 之类的东西:

struct my_struct_t* test_struct = new my_struct_t;

稍后,您当然会打电话而不是free打电话delete

于 2013-02-20T07:19:54.367 回答
1

malloc只会为对象分配必要的内存,但不会初始化该对象。C++ 中对象的初始化由其构造函数执行。C++ 提供了new同时分配内存和初始化对象的操作符。所以你应该做的是:

my_struct_t* x = new my_struct_t();

如果您真的打算在malloc这里使用,您仍然可以使用正确对齐的原始内存正确初始化对象placement new。请记住,您必须显式调用析构函数并显式释放内存。但我严重怀疑这是你的意图。

于 2013-02-20T07:27:35.487 回答