STL容器中插入对象与指针时的构造及析构函数调用分析
作者:沉沉浮浮触涙水 | 来源:互联网 | 2024-11-27 16:26
本文探讨了在使用STL容器(如map、vector和list)插入自定义类对象或指针时,构造函数和析构函数的调用情况,以及可能引发的问题。
### STL 容器插入对象时的构造函数调用 #### 示例类 `CT` 的定义 ```cpp #include #include class CT { public: CT() { std::cout <<"CT::CT()" < } CT(const CT&) { std::cout <<"CT::CT(const CT&)" < } ~CT() { std::cout <<"CT::~CT()" < } }; ``` #### 插入 `map` 容器 ```cpp void main() { std::map mval; CT t; mval.insert(std::make_pair(1, t)); } ``` - **`make_pair` 函数**:创建一个 `pair` 对象,首次调用复制构造函数 `CT(const CT&)`。 - **`pair` 构造函数**:将 `pair` 对象的两个成员初始化,再次调用复制构造函数 `CT(const CT&)`。 - **`pair` 转换构造函数**:当 `pair` 对象作为参数传递给 `insert` 方法时,第三次调用复制构造函数 `CT(const CT&)`。 - **`map` 内部节点构造**:在 `map` 内部创建节点时,第四次调用复制构造函数 `CT(const CT&)`。 总结:在 `map` 中插入一个类对象时,总共会调用四次复制构造函数和四次析构函数。 ### 其他容器的构造函数调用情况 #### `vector` 容器 ```cpp void _Insert_n(iterator _Where, size_type _Count, const _Ty& _Val) { _Ty _Tmp = _Val; // 首次调用复制构造函数 CT(const CT&) // 插入逻辑... } ``` - 在 `vector` 中插入一个类对象时,会调用两次复制构造函数和两次析构函数。 #### `list` 容器 - 在 `list` 中插入一个类对象时,仅调用一次复制构造函数和一次析构函数。 #### `queue` 容器 - 在 `queue` 中插入一个类对象时,同样仅调用一次复制构造函数和一次析构函数。 ### 插入指针时的问题 - 当插入的是指针而不是对象本身时,容器内部存储的是指针的副本。如果原始指针指向的内容被释放,容器中的指针将变为野指针,可能导致未定义行为。 ### 结论 不同 STL 容器在插入类对象时,其构造函数和析构函数的调用次数有所不同。理解这些调用机制有助于优化代码性能,并避免潜在的内存问题。
推荐阅读
题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!----- ...
[详细]
蜡笔小新 2024-12-26 15:55:56
本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ...
[详细]
蜡笔小新 2024-12-27 16:01:25
本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ...
[详细]
蜡笔小新 2024-12-27 11:26:39
本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ...
[详细]
蜡笔小新 2024-12-26 18:31:42
本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ...
[详细]
蜡笔小新 2024-12-26 17:55:52
本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ...
[详细]
蜡笔小新 2024-12-26 13:26:16
本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ...
[详细]
蜡笔小新 2024-12-26 08:55:03
Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ...
[详细]
蜡笔小新 2024-12-25 18:41:21
本文深入探讨了二叉搜索树(Binary Search Tree, BST)及其操作,包括查找、插入和删除节点。同时,文章还介绍了平衡二叉树(AVL树)的概念及调整方法,并详细讨论了如何判断两个序列是否构成相同的二叉搜索树。 ...
[详细]
蜡笔小新 2024-12-28 13:49:45
Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ...
[详细]
蜡笔小新 2024-12-28 09:44:49
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ...
[详细]
蜡笔小新 2024-12-27 18:51:49
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ...
[详细]
蜡笔小新 2024-12-27 15:06:12
本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ...
[详细]
蜡笔小新 2024-12-25 19:52:47