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

为什么在调用std :: map :: clear()之后仍然可以访问内存?

在调用 std::map::clear() 之后,仍然可以访问内存的原因是,std::map::clear() 只是将 std::map 中的元素删除,但并没有释放内存。这意味着,在调用 std::map::clear() 之后,std::map 的内存仍然被分配,并且可以继续使用。

如果您希望释放内存,可以使用 std::map::shrink_to_fit() 函数。这将尝试将 std::map 的内存占用减少到最小,并释放不再需要的内存。

需要注意的是,std::map::shrink_to_fit() 并不保证一定会释放内存,因为这取决于底层实现。因此,在使用 std::map::shrink_to_fit() 之后,仍然需要注意内存的使用情况。

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

相关·内容

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

我感觉可能是很多人都知道对于vector而言,clear()之后,修改了size()的结果,不影响capacity()的结果,因而得出clear()只是修改了某个标记,是常量时间复杂度的错误结论。...其实也可以用一个bool标记来存储后续是否需要遍历该容器,待到本次请求的响应返回给client之后,再来清理这个容器也不迟。 当然这种操作容器的元素个数不多的时候是完全没有必要的,会丧失一些可读性。...下面简要概述一下,对于unordered_map而言,其中的元素类型是: std::pair 如果你这样遍历: std::unordered_map<std...STL中容易踩坑的副作用 clear()不会清空vector的内存 尽管clear()会调用vector中元素的析构函数,但是并不会释放掉元素所占用的内存。...这并不难理解,因为vector为空的时候,我们也可以用reserve()函数来预分配内存。所以vector所占的内存并不会随着元素的释放而释放。

1.3K10

C++相关基础知识总结笔记

结构体的每个成员都有自己的名字和类型,并且可以独立地存储和访问内存布局:结构体的成员按声明顺序存储连续的内存位置中,每个成员占据其对应类型大小的内存空间。结构体的大小等于其所有成员大小的总和。...(可以通过传递类的实例给静态成员函数间接访问访问静态成员变量:静态成员函数可以访问类的静态成员变量。 调用静态成员函数:静态成员函数可以调用类的其他静态成员函数。 静态成员函数是否可以是虚函数?...例如,std::map::erase 会使被删除元素的迭代器失效,但不影响其他迭代器。 清空容器:使用 clear() 清空容器会使所有迭代器失效。 3....为什么需要内存对齐? 硬件需求:许多处理器访问未对齐的数据时会产生额外的开销。例如,如果一个 4 字节的整数不在 4 字节边界上,处理器可能需要两次内存访问来读取完整的数据,这会降低性能。...这意味着递归调用之后不再有其他的操作需要执行。尾递归函数可以被优化,使得每次递归调用都不会增加额外的栈空间。 尾递归的原理 尾调用: 递归调用是函数中的最后一个操作,递归调用之后没有其他的操作。

17820
  • 来聊聊C++中头疼的线程、并发

    为什么引入detach?如果创建了很多子线程,让主线程逐个等待子线程结束,这个编程方法不好。 一旦detach()之后,与主线程的thread对象就会与主线程失去关联,此时子线程就驻留在后台。...那为什么thread还能正常运行?因为创建thread时创建的副本子线程中运行。不行你可以显示实现一个拷贝构造函数看看。 } 线程传参 传递临时对象作线程参数 如果会对线程进行detach()。...多线程通讯共享内存,全局变量,指针,引用等都可以实现。 共享内存带来问题:数据一致性问题,可以用信号量技术来解决。...,该std::atomic_flag对象创建时处于clear状态。...原子对象的访问可以std::memory_order所指定建立线程间同步,并排序非原子的内存访问

    4.9K41

    再探 setmap

    之后,以前保存的iterator不会失效?...你可以删,但不可以改。 就像数据库的主键一样,你可以整条记录删掉,但是你想修改主键,嘿,不好意思。 键可删,不可改! 元素被修改后,容器并不会自动重新调整顺序,不为什么,因为没提供这个方法。...} ---- 为何map和set的插入删除效率比其他序列容器高,而且每次insert之后,以前保存的iterator不会失效? 1、因为存储的是结点,不需要内存拷贝和内存移动。...如果修改元素的实值,这是可以的,因为map元素的实值不影响map元素的排列规则。...因为二叉树不像数组那样连续的空间上访问,cache miss多,而且基于指针的父子节点关系,访问的时候多了一层指针地址的间接性。 ---- 到这儿吧,哥哥还有事儿呢。

    69320

    【Example】C++ 标准库常用容器全面概述

    这些容器和数组非常类似,都是逻辑上连续的(但内存不一定是连续的),与数组不同的是,容器可以非常方便的动态管理,而不是固定元素大小 std::vector 当你需要容器时,就找vector!...当你以局部变量形式创建并初始化 vector 时,对象本身是存储于栈内存当中,但是它所存储的元素却是内存当中连续的一块空间,因此 std::vector 对于随机访问效率会非常高。...capacity 返回不分配更多的内存的情况下vector可以包含的元素数。(当前内存空间) cbegin 返回指向vector中起始位置的常量迭代器。...引发失效的情况: 名称 情况 头尾插入 可能导致迭代器失效(全部或部分),但指针与引用仍然有效 头尾删除 其他元素的迭代器不失效 中间插入或删除操作 全部失效 具体原因: std::deque...可以脑海中将其类比为排队等候银行柜员的人。 元素(人)可从行的后部添加,并且可以从行的前部删除。 行的前部和后部都可以插入。 仅以这种方式访问前端和后端元素的限制是使用 queue 类的原因。

    3.3K30

    C++从入门到精通——string类

    然而,随着字符串的长度不断增长,二倍扩容可能会导致内存空间浪费的问题。为了解决这个问题,VS 编译器一定的阈值之后会切换到按1.5倍扩容的方式。...按照1.5倍扩容的方式,每次扩容时将当前内存块的大小乘以1.5,以提供更适当的额外空间。这种方式可以在一定程度上减少内存的浪费,同时仍然提供足够的空间用于字符串的增长。...// 调用shrink_to_fit函数,释放多余的内存空间 vec.shrink_to_fit(); std::cout << "调用shrink_to_fit函数后的容量:" <<...at()函数可以用于访问std::vector、std::array、std::deque以及std::string等容器。...5); // 迭代器指向的位置插入元素5 map中插入键值对: map scores = {{"Alice", 90}, {"Bob", 80}, {"Charlie",

    20310

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

    Node类的拷贝构造函数开始(默认拷贝构造函数会调用基类的拷贝构造函数,如果是自己实现的而且没有显式调用,将不会调用基类的拷贝构造函数),因为私有,故不能访问。...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数中执行资源的获取(指针的初始化),析构函数中释放(delete 指针)。...本文最前面的程序中,虽然实现了禁止拷贝,但如上所述,对象语义对象的生存期仍然是不容易控制的,下面将通过智能指针auto_ptr 来解决这个问题,通过类比上面NodePtr 类的实现可以比较容易地理解...= end(); ++it) delete *it; //释放指针指向的内存 std::vector::clear(); //释放指针本身...当Ptr_vector 对象销毁时调用析构函数,析构函数调用clear(),遍历vector,delete 裸指针。

    68710

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

    Node类的拷贝构造函数开始(默认拷贝构造函数会调用基类的拷贝构造函数,如果是自己实现的而且没有显式调用,将不会调用基类的拷贝构造函数),因为私有,故不能访问。...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数中执行资源的获取(指针的初始化),析构函数中释放(delete 指针)。...本文最前面的程序中,虽然实现了禁止拷贝,但如上所述,对象语义对象的生存期仍然是不容易控制的,下面将通过智能指针auto_ptr  来解决这个问题,通过类比上面NodePtr 类的实现可以比较容易地理解...= end(); ++it)             delete *it; //释放指针指向的内存         std::vector::clear(); //释放指针本身     }...当Ptr_vector 对象销毁时调用析构函数,析构函数调用clear(),遍历vector,delete 裸指针。

    1.8K00

    小王职场记 谈谈你的STL理解(1)

    更少的存储空间:std::map >std::hash_map 这里就是区别 2 测试查找操作 一般 少量数据情况下 map查找耗时最小, 随着数据的增加,map的查找耗时急剧上升(这里说的一般情况...: mapinstert方面 耗时更少,delte甚至差距更大 STL map , nginx,linux 虚拟内存管理,他们都有红黑树的应用....,删除和插入操作是从叶到根的,所以经过的路径都是logN(这从不命中角度说的 最长路径和最短路径不能超过2倍) 3. hash和map优化空间 map 占用少内存分析 Void clear(){t.clear...小缺页 glibc内存分配原理 1,当分配块小于128K时,通过brk系统调用控制堆顶往高方向变化。...容器clear操作不会释放内存

    29700

    小记最近踩得两个C++坑

    ,执行了茫茫多操作以后,间接调用了outter_map.erase([上一层函数用到的a]) obj_ptr->xxx; // 这里崩溃了,因为智能指针常量不再有效 } 如果这两个函数分散两个模块里...= outter_map.end()) { // 这意味着调用方要保证被调用方不会出现问题,而间接关心被调用方的实现 std::shared_ptr cache =...这些导致少量的内存泄露都还是其次,最重要的问题是,析构的时候,dlclose会进行析构的内存回收,主框架也会。这就导致了回收了两遍,并且回收不完全。...我们这里检测到是google::protobuf::FileDescriptorTables析构时hash table的析构的时候内存错误。...条件3的原因在于,很有可能程序执行一段时间之后再加载动态链接库,如果存在构造初始化,那么加载这个动态链接库的时候还是会把之前初始化正常的数据给冲刷掉。

    50520

    小记最近踩得两个C++坑

    ,执行了茫茫多操作以后,间接调用了outter_map.erase([上一层函数用到的a]) obj_ptr->xxx; // 这里崩溃了,因为智能指针常量不再有效 } 如果这两个函数分散两个模块里...= outter_map.end()) { // 这意味着调用方要保证被调用方不会出现问题,而间接关心被调用方的实现 std::shared_ptr cache =...这些导致少量的内存泄露都还是其次,最重要的问题是,析构的时候,dlclose会进行析构的内存回收,主框架也会。这就导致了回收了两遍,并且回收不完全。...我们这里检测到是google::protobuf::FileDescriptorTables析构时hash table的析构的时候内存错误。...条件3的原因在于,很有可能程序执行一段时间之后再加载动态链接库,如果存在构造初始化,那么加载这个动态链接库的时候还是会把之前初始化正常的数据给冲刷掉。

    1.5K31

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

    Node类的拷贝构造函数开始(默认拷贝构造函数会调用基类的拷贝构造函数,如果是自己实现的而且没有显式调用,将不会调用基类的拷贝构造函数),因为私有,故不能访问。...容易出现空悬指针、内存泄漏、重复删除等错误。 (二)、RAII 与 auto_ptr 一个对象可以拥有资源。在对象的构造函数中执行资源的获取(指针的初始化),析构函数中释放(delete 指针)。...本文最前面的程序中,虽然实现了禁止拷贝,但如上所述,对象语义对象的生存期仍然是不容易控制的,下面将通过智能指针auto_ptr 来解决这个问题,通过类比上面NodePtr 类的实现可以比较容易地理解...= end(); ++it) delete *it; //释放指针指向的内存 std::vector::clear(); //释放指针本身 }...当Ptr_vector 对象销毁时调用析构函数,析构函数调用clear(),遍历vector,delete 裸指针。

    1.1K20

    【C++】STL 容器 - vector 动态数组容器 ⑧ ( vector 容器添加 删除元素 | clear 函数 | insert 函数 | erase 函数 )

    & val); 调用 pop_back 函数 , 可以 vector 容器尾部删除元素 ; 在下面的函数原型中 , 该函数用于删除 vector 容器中的最后一个元素 void pop_back(...); 2、删除 vector 容器所有元素 - clear 函数 clear 函数 是 std::vector 容器的一个成员函数 , 用于移除容器中的所有元素 , 并释放元素占用的内存 ; std::..., 并使容器的 size 成员变量变为 0 ; 特别注意 : clear 函数 不会改变容器的 capacity 容量 ; std::vector 调用 capacity() 函数 , 可以获取容量..., 调用 vector 容器的 clear 函数 , 清空了容器中的元素 , 容器大小变为 0 , 容器的容量仍然为 3 ; #include "iostream" using namespace std...& val); 调用 pop_back 函数 , 可以 vector 容器尾部删除元素 ; 在下面的函数原型中 , 该函数用于删除 vector 容器中的最后一个元素 void pop_back(

    3K11

    C++ 序列化和反序列化

    问题: 在内存里存放的任何数据,它最基础的存储单元也是二进制比特,也就是说,我们应用程序操作的对象,它在内存中也是使用二进制存储的,既然都是二进制,为什么不能直接把内存中,对象对应的二进制数据直接通过网络发送出去...为什么还需要序列化和反序列化呢? 内存里存的东西,不通用, 不同系统, 不同语言的组织可能都是不一样的, 而且还存在很多引用,指针,并不是直接数据块。...char *m_Cap; // 分配内存末尾之后的位置 std::allocator m_Allocator; // 内存分配器 }; #endif //...reallocate进行内存的分配,重新分配的空间是原来的2倍, //然后数据转移,使用std::move而不是拷贝可以提高效率。...(const std::map& val); template DataStream& operator <<(const std::set<T

    1.5K20

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

    为什么呢?看后面的分析。...二,mapclear操作 2.1 clear源码 Void clear(){t.clear();}; //P241页《STL源码剖析》 由于关联容器底层是红黑树实现,所以mapclear也是调用的红黑树的...开发机中可以找到文件stl_tree.h,erase操作的源码如下: 该操作中核心调用的destroy_node分成两步: 1,先析构元素,2,然后释放内存。...3.1.4 析构函数 可以看到,即调用了析构函数,也调用内存释放函数。 所以常常vector或者string进行一系列操作后,容量变得非常大,那么可以通过下面的技巧进行容量的缩减。...另外一个副作用是:当key值map中不存在时,会自动map中插入一个key,value为默认值的元素。造成map结构增大。

    16.2K111

    C++项目(1):学生信息管理系统(简单教学版)

    为什么要有这个类,我就不说了。简单起见,成员属性只有3个,学生id,学生name,学生age。  三、数据存储  1. 软件执行过程中,数据存在内存中。...为了在内存中保存学生,用了一个map 的stu_map。用学生id作为map的key,用CStu作为map的value。选择map,主要是为了避免学号重复。  2....CStu的构造函数中,先把stu的id设为-1,做一个无效标记。下面会提到为什么要这样做。  ...main函数里,针对用户不同操作类型的输入,调用业务类CStuMg中的成员函数,执行相应的操作。  main和mainView开发过程中,可能会互相交叉着写。这个就看个人了。  ...// 是可以通过迭代器去访问到 m1里的东西,并且做出修改的!

    1.2K10

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

    qq-pf-to=pcqq.c2c# vector,clear()并不真正释放内存(这是为优化效率所做的事),clear实际所做的是为vector中所保存的所有对象调用析构函数(如果有的话),然后初始化...真正释放内存vector的析构函数里进行的,所以一旦超出vector的作用域(如函数返回),首先它所保存的所有对象会被析构,然后会调用allocator中的deallocate函数回收对象本身的内存...所以,某些编译器clear后还能访问到对象数据(因为它根本没清除),一些比较新的C++编译器上(例如VS2008),当进行数组引用时(例如a[2]这种用法),STL库中会有一些check函数根据当前容器的...所有内存空间是vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。...之后调用v.push_back()该指针,程序退出或者根据需要,用以下代码进行内存的释放:  for (vector::iterator it = v.begin(); it !

    12.4K30

    《C++并发编程实战》读书笔记(6):高级线程管理、并行算法函数、测试与除错

    > s; return s.do_sort(input); } 上述线程池仅具备一个全局的任务队列,即使使用无锁队列来优化仍然会有严重的缓存乒乓,导致性能浪费。...set() { flag.store(true, std::memory_order_relaxed); std::lock_guard lk(set_clear_mutex...中断线程实际应用中的常见场景是运行程序前开启后台任务,程序运行完退出时中断后台任务。...---- 第10章 并行算法函数 C++17向标准库加入了并行算法函数,原有函数的参数列表前新增了执行策略参数。...其中seq代表顺序策略,令算法函数发起调用的线程上执行全部操作,没有内存次序限制;par代表并行策略,内部操作可能在发起调用的线程上也可能另外创建线程执行,涉及的变量绝不能引发数据竞争;par_unseq

    32320

    【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅

    vector 是最常用的 STL 顺序容器之一,它的特点是支持 动态数组,可以在运行时自动扩展容量,提供高效的随机访问。...1.2 为什么使用 vector 与传统的 C 风格数组(T array[N])相比,vector 具有以下优势: 动态调整大小,无需手动管理内存; 提供了丰富的接口,支持插入、删除、查找等操作; 内置内存管理机制...; vector v = {1, 2, 3, 4, 5}; // 自动管理内存和大小 1.3 vector 的优缺点 优点:动态扩展、支持随机访问、效率高。...环境下不会立刻崩溃,但输出结果仍然是不可靠的。...以上就是关于【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅的内容啦,各位大佬有什么问题欢迎评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️

    20610
    领券