首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从STL容器中删除元素时是否调用析构函数?

从STL容器中删除元素时,是否调用析构函数取决于容器的类型和删除方式。以下是几种常见的删除方式:

  1. 使用erase()函数删除元素:

当使用erase()函数删除元素时,容器会调用元素类型的析构函数。例如:

代码语言:cpp
复制
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.erase(vec.begin() + 1); // 删除第二个元素

在这个例子中,当删除第二个元素时,int类型的析构函数会被调用。

  1. 使用clear()函数清空容器:

当使用clear()函数清空容器时,容器会调用所有元素的析构函数。例如:

代码语言:cpp
复制
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.clear(); // 清空容器

在这个例子中,当清空容器时,所有int类型的析构函数都会被调用。

  1. 使用swap()函数交换容器:

当使用swap()函数交换两个容器时,容器会调用元素类型的析构函数。例如:

代码语言:cpp
复制
std::vector<int> vec1 = {1, 2, 3, 4, 5};
std::vector<int> vec2 = {6, 7, 8, 9, 10};
vec1.swap(vec2); // 交换两个容器

在这个例子中,当交换两个容器时,所有int类型的析构函数都会被调用。

总结:从STL容器中删除元素时,容器会自动调用元素类型的析构函数。在某些情况下,如果需要避免调用析构函数,可以使用std::vector<T>::erase()函数删除元素,并使用std::vector<T>::pop_back()函数删除最后一个元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

map容器clear操作不会释放内存?

在开发机可以找到文件stl_tree.h,erase操作的源码如下: 该操作核心调用的destroy_node分成两步: 1,先元素,2,然后释放内存。...如果有足够容量,则只调用construct构造元素即可。 3.1.3删除操作(pop_back,erase,clear等) 只调用函数destroy,并不会进行内存的释放。...即容器的capacity并不会变化。 3.1.4 函数 可以看到,即调用函数,也调用了内存释放函数。...3.3.3 删除操作 如果删除的一段缓冲区还有数据,则只对象,并不释放内存。 如果删除后,该段缓冲区没有数据,则元素,并释放内存。...Clear或者erase操作后,会保留一个缓存区,只对其元素。其他缓冲区即函数,也释放内存。 3.4 关联容器之map 关联容器都是红黑树(hash_xx除外)。

15.8K111

一些关于广泛使用的C++标准库STL的思考

文章目录 from Effective STL 1、接纳typedef 容器的拷贝现象 小习惯:使用empty来代替检查size()是否为0 尽量使用区间成员函数代替循环 关于在容器存放指针...此外,这条原则还指出了其他多种区间函数,比如说批量删除、批量赋值等 ---- 关于在容器存放指针 的确,当一个指针的容器被销毁,会销毁它(那个容器)包含的每个元素,但指针的“函数”是无操作!...比如,有的人故意string继承: class SpecialString: public string { ... }; 这是很危险的行为,因为string,就像所有的标准STL容器,缺少虚函数...,而从没有虚函数的类公有继承是一个大的C++禁忌。...如果没有意识到问题,或者是不能确定是否有那个问题,那可真的是好了伤疤忘了疼啊。 当容器的一个元素被删,指向那个元素的所有迭代器都失效了。当c.erase(i)返回,i已经失效。

45330

C++面试题

这时候如果函数不是虚函数,就不能正确识别对象类型从而不能正确调用函数。...当一个元素被插入到一个STL列表(list),列表容器自动为其分配内存,保存数据。考虑到要将STL容器放到共享内存,而容器却自己在堆上分配内存。...当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。erase方法会返回下一个有效的迭代器,所以当我们要删除某个元素,需要it=vec.erase(it);。...2) 在初始化过程,会先推断待初始化的元素类型是否为内置类型,若为内置类型POD(Plain Old Data),则直接调用更加底层的函数,上面三个函数相应的底层函数分别为:memmove(b1,b,...如果编译器无法调用类的函数,情况会是怎样的呢?比如,类的函数是私有的,编译器无法调用函数来释放内存。

1.7K42

【C++】STL 容器 - STL 容器的值语意 ( 容器存储任意类型元素原理 | STL 容器元素可拷贝原理 | STL 容器元素类型需要满足的要求 | 自定义可存放入 STL 容器元素类 )

; 2、STL 容器元素可拷贝原理 STL 容器 定义 , 所有的 STL 容器 的相关操作 , 如 插入 / 删除 / 排序 / 修改 , 都是 基于 值 Value 语意 的 , 不是 基于 引用...Reference 语意的 ; 比如 : 向 STL 容器 插入元素 , 插入的都是实际的 值 Value 语意 , 不是 引用 Reference 语意 ; 如果 基于 引用 或者 指针 操作...容器元素类型需要满足的要求 STL 容器元素类型需要满足的要求 : 提供 无参 / 有参 构造函数 : 保证可以创建元素对象 , 并存放到容器 ; 提供 拷贝构造函数 : STL 容器元素是可拷贝的...容器元素类 1、代码示例 STL 容器元素类型需要满足的要求 : 提供 无参 / 有参 构造函数 : 保证可以创建元素对象 , 并存放到容器 ; 提供 拷贝构造函数 : STL 容器元素是可拷贝的..., 以便进行链式调用 return *this; } 此外 , 还有函数 , 在函数 , 释放申请的 char* 内存 , 然后置空 ; ~Student() { if (m_name

9710

【C++】开散列哈希表封装实现unordered_map和unordered_set

最好的查询是,只要进行很少的比较次数就能够将元素找到,因此在C++11STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是 其底层结构不同...在函数调用结束之后,临时对象newHT会被销毁,那我们还需要写哈希表的函数吗?...其实是不需要的,哈希表类默认生成的函数对内置类型_n不处理,对自定义类型vector调用函数,vector存储内容都可以看作是内置类型,因为键值对说到底也就是单一的结构体,所以vector的函数直接将...那么我们就不需要自己写哈希表的函数,vector会帮我们做处理,并且内置类型_n成员还不用处理。...对于哈希桶,我们必须写出函数,因为编译器默认生成的函数调用vector的,而vector的仅仅只能将自己的空间还给操作系统,如果某些节点指针指向了具体的节点,则只归还vector的空间是不够的

1.6K30

常见c和cpp面试题目汇总(一)

[]会调用每个成员的函数 用new分配的内存用delete释放,用new[]分配的内存用delete[]释放 八、STL库用过吗?...STL包括两部分内容:容器和算法;容器即存放数据的地方,比如array, vector,分为两类,序列式容器和关联式容器: 序列式容器,其中的元素不一定有序,但是都可以被排序,比如vector,list...unordered_map底层是一个防冗余的哈希表,存储根据key的hash值判断元素是否相同,即unoredered_map内部是无序的。 十三、 构造函数为什么一般不定义为虚函数?...,还没有内存空间,更没有虚函数表地址用来调用函数即构造函数了 2、函数最好声明为虚函数 首先函数可以为虚函数,当一个指向派生类的基类指针,最好将基类的函数声明为虚函数,否则可以存在内存泄露的问题...如果函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类的基类指针,只会调用基类的函数而不调用派生类函数,这样就会造成派生类对象不完全。

1.2K31

你们要的C++面试题答案来了--基础篇

pa ,pb之间互相引用,两个资源的引用计数为2,当要跳出函数,智能指针pa,pb两个资源引用计数会减一,但是两者引用计数还是为1,导致跳出函数资源没有被释放(A B的函数没有被调用),如果把其中一个改为...,如对象所在的函数调用完毕,系统会自动执行函数。...如果用户没有编写函数,编译系统会自动生成一个缺省的函数(即使自定义了函数,编译器也总是会为我们合成一个函数,并且如果自定义了函数,编译器在执行时会先调用自定义的函数调用合成的函数...当基类指针指向子类对象,如果基类的函数不是virtual,那么子类的函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。...8、申请数组:new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多次调用函数,销毁数组的每个对象。而malloc则只能sizeof(int) * n。

2.8K30

【C++进阶】深入STL之list:模拟实现深入理解List与迭代器

前言: 在STL,list是一种双向链表,它支持在序列的任何位置进行快速插入和删除操作。与此同时,迭代器是STL中非常重要的一个概念,它使得我们能够以统一的方式遍历和访问STL容器元素。...关于函数,我们需要的是将所有节点一 一释放就ok啦!...在模拟函数之前,不得不先介绍一下clear这个函数,因为clear可以删除出头节点以外的所有节点,我们可以利用这一点帮助我们优化函数 list(示例): void clear() { //..._head = nullptr; } 拷贝构造函数 在学习list,我们发现list不会因为空间不够而需要扩容,因此在使用模拟list,不用考虑是否会发生浅拷贝 list拷贝构造函数(示例):...容器元素 5.

7410

vector clear() 方法 内存释放问题

qq-pf-to=pcqq.c2c# vector,clear()并不真正释放内存(这是为优化效率所做的事),clear实际所做的是为vector中所保存的所有对象调用函数(如果有的话),然后初始化...真正释放内存是在vector的函数里进行的,所以一旦超出vector的作用域(如函数返回),首先它所保存的所有对象会被,然后会调用allocator的deallocate函数回收对象本身的内存...先来看看"C++ Primer"怎么说:为了支持快速的随机访问,vector容器元素以连续方式存放,每一个元素都紧挨着前一个元素存储。...所有内存空间是在vector时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。...当时如果nums是一个类的成员,不能把vector.swap(nums)写进类的函数,否则会导致double free or corruption (fasttop)的错误,原因可能是重复释放内存

11.9K30

cc++问题集三

(临时对象),首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数(或转移构造函数)将这个临时对象放入容器。...哈希函数(散列函数) 直接寻址法 数字分析法 平方取中法 折叠法 随机数法 除留余数法 查询性能: 散列函数是否均匀 处理冲突的方法 散列表的装填因子 :α= 填入表元素个数 / 散列表的长度 4、...B才,对于B,A必定是B后才A,这就是循环引用的问题,违反常规,导致内存泄露。...调用push_back当空间不够装下数据时会自动申请另一片更大的空间(一般是原来的两倍),然后把原有数据拷贝过去,之后在拷贝push_back的元素,最后要原有的vector并释放原有的内存空间 当调用...,元素是否唯一的区别 无序关联容器 C++11开始提供的容器,无序的容器,unordered_map、unordered_multimap、unordered_set、unordered_mutiset

84430

STL中有哪些副作用或稍不注意会产生性能开销的地方?

STL稍不注意会产生性能开销的地方 STL容器的clear的时间复杂度不是O(1) 可能很多人都不在意,在使用STL容器的时候,潜意识里面将clear()成员函数视为常量时间复杂度O(1)的。...因为只要执行了clear()就需要对其存储的元素调用函数,这个操作显然是逐个的。因而时间复杂度是O(n)。 当然在实践,也有个例。...比如当vector存储基本数据类型或POD类型(比如基本数据类型构成的struct)的时候,由于其元素类型没有函数(也不需要函数),加之vector内部连续存储的特性,编译器的实现是可以在常量时间完成...所以在工程实践,我们要思考是否每次都需要及时的clear掉一个容器。...STL容易踩坑的副作用 clear()不会清空vector的内存 尽管clear()会调用vector中元素函数,但是并不会释放掉元素所占用的内存。

1.2K10

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

释放这些资源的任务也是自动完成(外部对象的函数调用内部对象的函数)。...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数执行资源的获取(指针的初始化),在函数释放(delete 指针)。...对auto_ptr 做一点小结: 1、auto_ptr不能作为STL容器元素 2、STL容器要求存放在容器元素是值语义,要求元素能够被拷贝。...,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 类有成员vector vec_; 那么在类的函数需要遍历容器...当Ptr_vector 对象销毁时调用函数函数调用clear(),遍历vector,delete 裸指针。

66510

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

释放这些资源的任务也是自动完成(外部对象的函数调用内部对象的函数)。...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数执行资源的获取(指针的初始化),在函数释放(delete 指针)。...对auto_ptr 做一点小结: 1、auto_ptr不能作为STL容器元素 2、STL容器要求存放在容器元素是值语义,要求元素能够被拷贝。...,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 类有成员vector vec_; 那么在类的函数需要遍历容器...当Ptr_vector 对象销毁时调用函数函数调用clear(),遍历vector,delete 裸指针。

1.8K00

RAII_ras raf

C++标准保证任何情况下,已构造的对象最终会销毁,即它的函数最终会被调用。...简单的说,RAII 的做法是使用一个对象,在其构造获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象的时候释放资源。...常性类型是指获取资源的地点是构造函数,释放点是函数,并且在这两点之间的一段时间里,任何对该RAII类型实例的操纵都不应该它手里夺走资源的所有权。...3RAII实际应用 每当处理需要配对的获取/释放函数调用的资源,都应该将资源封装在一个对象,实现自动资源释放。...4RAII与STL容器 STL容器是基于值语义的,在容器内部,对象是常被复制的。如果RAII类型需要存入STL容器,需要作一些处理。

38620

C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

1.stack的初步介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境,其删除只能从容器的一端进行元素的插入与提取操作。...队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素元素队尾入队列,队头出队列。...5.2STL标准库stack和queue的底层结构 虽然stack和queue也可以存放元素,但在STL并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装...、函数之类的会去调用传过来的的类的 void push(const T& x) { _con.push_back(x); } void pop() { _con.pop_front...、函数之类的会去调用传过来的的类的 void push(const T& x) { _con.push_back(x); } void pop() { _con.pop_front

17410

C++基础 智能指针

对于普通的 局部变量(非静态局部变量),当离开它的作用域,操作系统会自动将其释放。类对象在释放的时候是会自动调用该类的函数。...于是我们就想:如果是Test *t不是一个普通的指针变量,而是一个类对象的话,并且在类的函数实现了释放动态内存的步骤,那么只要该指针变量一退出作用域就会调用函数,达到了释放动态内存的目的。...*引用计数**实现管理 一旦最后一个这样的指针被销毁(计数变为0),该对象会被自动删除 weak_ptr 一般与shared_ptr配合使用,它可以shared_ptr构造,其构造和不改变引用计数...对于特定对象,同一刻只能有一个智能指针可拥有, 最终只有拥有对象的智能指针的构造函数删除该对象,auto_ptr和unique_ptr就是采用这种策略 创建智能更高的指针,跟踪引用特定对象的智能指针个数...选择使用参考 如果程序要使用多个指向同一个对象的指针,那么应该使用shared_ptr 比如说现在有一个包含指针的STL容器,现在用某个支持复制和赋值操作的STL算法去操作该容器的指针元素,那么就应该用

59520

什么是智能指针

这个对象何时? 过早,程序发生错误;不进行,又造成了内存泄露。 这里的解决方案就是智能指针,而且是引用计数型的智能指针。...将 weak_ptr 传递给 shared_ptr 的构造函数,要是对象已被,则抛出 std::exception 异常。...调用 weak_ptr 的 expired() 方法,若对象已经被,则 expired() 将返回 true。...这样的情况包括: 有一个指针数组,并使用一些辅助指针来标示特定的元素,如最大的元素和最小的元素; 两个对象包含都指向第三个对象的指针; STL 容器包含指针。...可以将 unique_ptr 存储到 STL 容器,只要不调用将一个 unique_ptr 复制或赋给另一个的算法(如 sort())。例如,可在程序中使用类似于下面的代码段。

59820

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)

释放这些资源的任务也是自动完成(外部对象的函数调用内部对象的函数)。...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数执行资源的获取(指针的初始化),在函数释放(delete 指针)。...对auto_ptr 做一点小结: 1、auto_ptr不能作为STL容器元素 2、STL容器要求存放在容器元素是值语义,要求元素能够被拷贝。...,在这里再提一点,就是vector 只负责裸指针本身的内存的释放,并不负责指针指向内存的释放,假设一 个MultipleNode 类有成员vector vec_; 那么在类的函数需要遍历容器...当Ptr_vector 对象销毁时调用函数函数调用clear(),遍历vector,delete 裸指针。

1K20

嵌入式面试高频考点整理(建议收藏)

申请自定义类型对象,malloc/free只会开辟空间,不会调用构造函数函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用函数完成空间中资源的清理。...之所以被称为顺序容器,是因为元素容器的位置同元素的值无关,即容器不是排序的。将元素插入容器,指定在什么位置(尾部、头部或中间某处)插入,元素就会位于什么位置。...[16] STL的vector的实现,是怎么扩容的 vector 为空的时候没有预分配空间,每次添加一个元素,会判断当前是否还有剩余可用空间,如果没有则进行试探性扩容,并且把内存拷贝到新申请的内存空间上...,还没有内存空间,更没有虚函数表地址用来调用函数即构造函数函数最好声明为虚函数 首先函数可以为虚函数,当一个指向派生类的基类指针,最好将基类的函数声明为虚函数,否则可以存在内存泄露的问题...如果函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类的基类指针,只会调用基类的函数而不调用派生类函数,这样就会造成派生类对象不完全。

67120

STL容器的线程安全性了解多少?

* * 但是,当容器容纳得是通过 new 分配得对象得指针,一个指针得容器被销毁,会销毁它包含得每个元素 * ,但指针得 函数 是无 操作得,不可不会调用delete ; 看情况3 * */ //...Widget* 指针,是冗余得,并且会导致很难追踪到得bug } //string 缺少函数,没有函数得类不能公有继承 //如果你这样写 class SpString:public std...* 这是 sort 调用返回,vecotor的内容以及改变,而且至少一个 Widget 已经被删除了 */ } 条款9:在删除选项仔细选择 //标准STL容器c, 容纳int, 你想把c...* * 3,在循环内做某些事情(除了删除对象之外) * 3.1 如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase记得都用它得返回值更新你得迭起器 * 3.2 如果是标准关联容器,...当你用完这个vector,你调用它的函数,然后释放vector占用的内存。代码不很 复杂,但我们在上面所做的比仅仅声明一个本地变量要苛刻得多。

1.3K10
领券