热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

STL容器中插入对象与指针时的构造及析构函数调用分析

本文探讨了在使用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%%%受益匪浅!-----&# ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文深入探讨了二叉搜索树(Binary Search Tree, BST)及其操作,包括查找、插入和删除节点。同时,文章还介绍了平衡二叉树(AVL树)的概念及调整方法,并详细讨论了如何判断两个序列是否构成相同的二叉搜索树。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
author-avatar
沉沉浮浮触涙水
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有