首页 > 解决方案 > C 结构中的 std::vector

问题描述

typedef struct _route_timer_info_t {
    task_timer * withdraw_timer;
    std::vector<sockaddr_union> mcast_addr_list;
    uint32_t route_block_id;
    uint32_t bgp_device_id;
}route_timer_info_t;

我的代码中有上述结构。我已经获取了指向上述结构的指针并从堆中分配了内存。

route_timer_info_t *route_timer=(route_timer_info_t *)malloc(sizeof(route_timer_info_t));

现在要填充向量,我正在做

route_timer->mcast_addr_list.push_back(some_item)

在第一次运行时,向量的大小是正确的——我正在推动很多,但是在第二次运行时,当整个结构被分配内存时,向量的大小会出现一些大的垃圾值。可能出了什么问题?我也尝试过清除矢量但没有帮助。

标签: c++mallocstdvector

解决方案


malloc 只分配一块内存,这是未启动的。对于 C 代码,这通常是一个成员。在 C++ 中,有构造函数的概念。

默认情况下,每个类和结构都会得到这个,编译器应该以最好的方式对其进行优化。在堆栈上构造实例或使用 new 运算符时会隐式调用它。

在某些特殊情况下,你喜欢先分配内存,然后再构造。(std::vector 这样做)你可以这样做:

auto validPtr = new (&route_timer->mcast_addr_list)   std::vector<sockaddr_union>();

更好的是直接调用 new :

new route_timer_info_t();

为确保所有成员都初始化为已知值,我建议显式初始化所有成员:

struct _route_timer_info_t {
    task_timer * withdraw_timer{nullptr};
    std::vector<sockaddr_union> mcast_addr_list{};
    uint32_t route_block_id{0};
    uint32_t bgp_device_id{0};
};

为了让故事更完整,从 C++14 开始,不建议再直接调用 new,而是可以通过以下方式直接创建唯一指针:

 std::make_unique<route_timer_info_t>();

在所有这些情况下,包括您的原始示例,该结构与 C 不兼容。


推荐阅读