C++结构体中包含容器,push_back异常

本文探讨了在C++中为何不能使用malloc为包含vector成员的自定义结构体分配内存,并给出了正确的实现方式。通过使用new操作符替代malloc,解决了结构体内vector动态扩容的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

形如

typedef struct A
{
    vector<int> v;
} AA;
AA* tmp;
tmp = (AA*)malloc(sizeof(AA));
tmp->v.push_back(1);//此处出错

最终发现,是因为结构体内的vector的大小是动态的,不能用malloc给其分配内存。

改成如下代码即可运行:

typedef struct A
{
    vector<int> v;
} AA;
AA* tmp;
tmp = new AA();
tmp->v.push_back(1);//成功

### C++ 中 `push_back` 和 `emplace_back` 的区别 #### 定义与功能 `push_back` 和 `emplace_back` 都用于向标准库容器(如 `std::vector` 或 `std::deque`)的末尾添加元素。然而,两者的实现方式存在显著差异。 对于 `push_back` 方法,在将新元素加入容器之前,会先创建该类型的临时对象,随后通过拷贝或移动操作将其传递给容器[^1]。这意味着可能会涉及额外的对象构造和销毁开销。 相比之下,`emplace_back` 则更为直接:它利用传入的参数原位构建目标类型的新实例于容器内部存储空间之中,从而省去了中间环节中的复制或者转移过程[^2]。 #### 性能考量 当性能成为首要考虑事项,并且能够提前知晓待插入项的确切初始化数据时,则推荐采用 `emplace_back` 来代替传统的 `push_back` 方式来提升运行效率[^3]。这是因为前者减少了不必要的构造/析构动作次数——仅需执行单次构造即可完成整个流程;后者则至少要经历两次这样的生命周期事件(即原始实体建立加上后续迁移至最终位置的动作),这无疑增加了计算负担尤其针对复杂结构体而言尤为明显[^4]。 以下是简单的代码示例展示两种方法的应用: ```cpp #include <iostream> #include <vector> class MyClass { public: int value; // Constructor with parameter explicit MyClass(int val):value(val){ std::cout << "Constructor called\n"; } }; int main(){ std::vector<MyClass> vec; // Using push_back creates a temporary object first. vec.push_back(MyClass(10)); // Using emplace_back constructs the object directly inside the container. vec.emplace_back(20); return 0; } ``` 上述程序片段中可以看到,当我们使用 `push_back` 添加一个新的 `MyClass` 实例到矢量列表里边的时候,实际上发生了两个阶段的操作—先是制造了一个短暂存在的局部变量,接着才把这个东西搬移到集合当中去。但是切换成运用 `emplace_back` 后面就只发生了一步行动,也就是直接依据所提供的数值建立起那个成员本身的位置上所需的数据单元而已。 #### 使用场景分析 尽管如此,还是应该注意到并非任何时候都适合选用 `emplace_back`. 如果当前所处理的是相对较为基础或者是已经预先定义好的现成物件的话,那么继续沿用熟悉的 `push_back` 可能反而显得更加简洁明了而且易于维护理解. 此外值得注意的一点就是关于兼容性的议题,因为毕竟不是所有的开发环境都能够支持最新版本的标准特性,所以在决定采纳哪一种策略前也得充分评估项目实际状况以及团队成员的技术水平等因素综合判断最为恰当的选择方案才是明智之举. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值