热门标签 | 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 容器在插入类对象时,其构造函数和析构函数的调用次数有所不同。理解这些调用机制有助于优化代码性能,并避免潜在的内存问题。
推荐阅读
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社区 版权所有