C++中emplace函数的不适场景总结(三)

可能产生的内存泄露

上文中一直考虑 vector 扩容的情况。现在来分析一下,有下面一份代码:

复制代码
#include <memory>
#include <string>
#include <vector>

int main() {
    std::vector<std::shared_ptr<std::string>> arr;
    // todo

    std::string str("Hello World");
    arr.push_back(std::shared_ptr<std::string>(new std::string(str)));
    arr.emplace_back(new std::string(str));
}

此处的 todo 可能对 arr 做了一些操作,而到了 push_back() 和 emplace_back() 的两行中都会进行插入操作。

假设两处的插入操作都有扩容的可能,也就是说在此处会有新的内存分配可能。一旦涉及到内存的分配都有可能会出现异常或者其他情况。

假设 push_back() 处因为内存分配出现了异常,则作为参数的 std::shared_ptr<std::string>(new std::string(str)) 因为已经是一个智能指针的对象了,可以借助 RAII 的特性成功的回收管理 new 出来的内存。

而假设 emplace_back() 处因为内存分配出现了异常,则由于 new 出来的参数是一个裸指针,这块内存将再也无法回收,也就是直接内存泄漏了。

因为请勿直接传递裸指针到 emplace() 函数中。

总结与建议

关于 emplace() 的优势必然是 原位构造。而劣势也就是无法进行原位构造。

因此在编程时需要在保证内存不会泄露的情况下,了解各种容器对于原生的插入操作和 emplace() 操作的性能差别。

除了本文中直接给出的示例,还可以通过一些代码分析工具去分析。刷题党甚至可以通过交替使用 emplace() 和 push()/insert() 操作进行提交,根据 oj 的返回结果进行规律的分析。

相关推荐
-To be number.wan2 分钟前
算法日记 | STL- sort排序
c++·算法
不想写代码的星星2 分钟前
编译期策略模式:当模板成为策略容器
c++
啦啦啦啦啦zzzz3 分钟前
数据结构:平衡二叉树
数据结构·c++·二叉树
玖釉-3 分钟前
Vulkan 中 Shader 的 vert、frag、mesh、comp 全面解析:作用、关系、特点与工程实践
开发语言·c++·windows·算法·图形渲染
智者知已应修善业23 分钟前
【51单片机2个外部中断切换LED花样】2024-1-3
c++·经验分享·笔记·算法·51单片机
陕西企来客28 分钟前
2026 西安 GEO 优化技术解析:前沿技术与行业规范深度企来客科技行业白皮书声明
开发语言·搜索引擎·php
8Qi829 分钟前
LeetCode 31:下一个排列(Next Permutation)—— 完整题解笔记 ✅
笔记·算法·leetcode·指针·思维·排列
AI科技星31 分钟前
基于光速螺旋第一性原理:$G,\varepsilon_0,\alpha$引电统一完整推导+严谨证明+高精度数值全维度分析
c语言·开发语言·网络·量子计算·agi
春日见33 分钟前
五分钟入门强化学习DDPG
大数据·人工智能·算法·机器学习·计算机视觉
玖釉-34 分钟前
Vulkan 示例解析:gltfscenerendering.cpp 如何渲染一个复杂 glTF 场景
c++·windows·图形渲染