c++ - 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)
在第一次运行时,向量的大小是正确的——我正在推动很多,但是在第二次运行时,当整个结构被分配内存时,向量的大小会出现一些大的垃圾值。可能出了什么问题?我也尝试过清除矢量但没有帮助。
解决方案
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 不兼容。
推荐阅读
- javascript - 有没有办法将 vue 数据值与全局存储状态值同步?
- android - 在透明颤动应用程序中使用背景模糊
- python - multiprocessing.Process 不做任何事情
- r - 加载 tidyverse 时出错:包或 namspace 加载失败
- php - 为 Firebase 云消息传递 PHP 生成 OAUTH 令牌
- vue.js - 数据中的Vue访问对象
- c - GCC 关于在偏移量处访问字节的警告:GCC 抱怨什么?
- outlook-addin - 根据官方指南,Web Outlook 加载项侧载失败
- c# - 用于 ASP.NET Core Web 应用和辅助服务的通用数据库访问存储库 - 管理上下文
- python - 如何从 gcloud 中的版本恢复文件