print call frame now:
frame 0 -- ./datactlserver(_Z13SignalHandleri+0x50) [0x4102e0]
frame 1 -- /lib64/libc.so.6() [0x376e832a20]
frame 2 -- /usr/lib64/libstdc++.so.6(_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_+0x5f) [0x3774069fbf]
frame 3 -- ./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE10_M_insert_EPKSt18_Rb_tree_node_baseSD_RKS4_+0xb1) [0x427b97]
frame 4 -- ./datactlserver(_ZNSt8_Rb_treeIjSt4pairIKjP13RecvStateInfoESt10_Select1stIS4_ESt4lessIjESaIS4_EE16_M_insert_uniqueERKS4_+0x1e6) [0x426f0c]
frame 5 -- ./datactlserver(_ZNSt3mapIjP13RecvStateInfoSt4lessIjESaISt4pairIKjS1_EEE6insertERKS6_+0x23) [0x426521]
frame 6 -- ./datactlserver(_ZN11CThreadPool17PushSockStateInfoEi13RecvStateInfo+0x113) [0x425e8f]
frame 7 -- ./datactlserver(_ZN13CListenThread6ListenEv+0x490) [0x42aeb8]
frame 8 -- ./datactlserver(_ZN13CListenThread3RunEv+0x4b) [0x42a8f3]
/home/dong.zhang/work/2.22/datactl/src/server/src/threadpoll.cpp:1109
m_pSockStateQueue->insert(pair<INT32, RecvStateInfo*>(sock, pSockStateInfo));
425e4b: 48 8d 55 c8 lea -0x38(%rbp),%rdx
425e4f: 48 8d 4d b4 lea -0x4c(%rbp),%rcx
425e53: 48 8d 45 f0 lea -0x10(%rbp),%rax
425e57: 48 89 ce mov %rcx,%rsi
425e5a: 48 89 c7 mov %rax,%rdi
425e5d: e8 42 06 00 00 callq 4264a4 <_ZNSt4pairIiP13RecvStateInfoEC1ERKiRKS1_>
425e62: 48 8d 55 f0 lea -0x10(%rbp),%rdx
425e66: 48 8d 45 e0 lea -0x20(%rbp),%rax
425e6a: 48 89 d6 mov %rdx,%rsi
425e6d: 48 89 c7 mov %rax,%rdi
425e70: e8 5d 06 00 00 callq 4264d2 <_ZNSt4pairIKjP13RecvStateInfoEC1IiS2_EERKS_IT_T0_E>
425e75: 48 8b 45 b8 mov -0x48(%rbp),%rax
425e79: 48 8b 80 24 02 00 00 mov 0x224(%rax),%rax
425e80: 48 8d 55 e0 lea -0x20(%rbp),%rdx
425e84: 48 89 d6 mov %rdx,%rsi
425e87: 48 89 c7 mov %rax,%rdi
425e8a: e8 6f 06 00 00 callq 4264fe <_ZNSt3mapIjP13RecvStateInfoSt4lessIjESaISt4pairIKjS1_EEE6insertERKS6_>
425e8f: 48 89 c1 mov %rax,%rcx
425e92: 89 d0 mov %edx,%eax
425e94: 48 89 4d a0 mov %rcx,-0x60(%rbp)
425e98: 88 45 a8 mov %al,-0x58(%rbp)
425e9b: 48 8b 45 a0 mov -0x60(%rbp),%rax
425e9f: 48 89 45 d0 mov %rax,-0x30(%rbp)
425ea3: 0f b6 45 a8 movzbl -0x58(%rbp),%eax
425ea7: 88 45 d8 mov %al,-0x28(%rbp)
增加保护机制,插入数据前检查MAP容器最大值和当前值,若小于等于则插入,若大于插入失败
一:vector容器用法总结
参考链接
:
https
:
//blog.csdn.net/qq_36734094/article/details/79748612#commentBox
在c++中,vector是一个十分有用的容器。
作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能...
//m_oFunction
Map
[strKey] = pNew;
m_oFunction
Map
.
insert
(
std
:
:
map
<
std
:
:
string, MemoryRecord*>
:
:
value_type(strKey, pNew));
第一句有时会导致
崩溃
.
第二句则正常.
今天调试程序时,在
std
:
:
map
insert
(),会产生错误中断,分析过程如下:
定义了一个全局的
map
变量,在a.h中声明,在a.cpp中定义并定义了初始化函数;在另一个文件use_a.cpp中,调用
map
变量初始化函数init
Map
TimeInter;运行时在
map
TimeInter.
insert
(
std
:
:
make_pair(1,"0.1"));处产生中断错误,定义如下:
// a.
最近项目中使用到stl unorder
map
,当
map
存储的key数量上升到10的6次-7次甚至8次以上时,unorder
map
的
insert
接口性能有严重瓶颈
下面是测试代码:int main() {
std
:
:
unordered_
map
t;
for (int i = 0; i <= 10000000; ++i) {
t.
insert
(make_pair(i, 1))
#0 0x00000000008da74a in
std
:
:
local_Rb_
tree
_decrement(
std
:
:
_Rb_
tree
_node_base*) ()
Missing separate debuginfos, use
:
debuginfo...
void Master
:
:
MasterManageSlaveTimeOut()
mLog->getLogPoint(sLogName)->info(QString(" MasterManageSlaveTimeOut "));
Q
Map
<QTcpSocket *, bool>
:
:
iterator it;
QList<...
map
容器的
insert
函数在使用时抛出异常,不是插入失败而是插入报异常。
插入到
map
中的数据的数据结构被改变了,导致
map
中容纳的数据结构和实际上插入的数据结构不相同,虽然数据类型的标识符相同,但实际可容纳的数据和插入的不同,导致了插入报出异常。
1、出现“插入的数据和
map
中容纳的数据的数据结构不相同”这种情况的原因是,数据定义的动态库,和
map
容
#### 初始化与基本操作
在 C++ 标准模板库 (STL) 中,`
map
` 是一种关联容器,它存储键值对并保持按键排序。默认情况下,`
map
` 使用红黑树实现,而 `unordered_
map
` 则基于哈希表实现[^1]。
创建一个简单的整数到字符串映射:
```cpp
#include <iostream>
#include <
map
>
using namespace
std
;
int main() {
// 创建
map
<int, string> 并插入一些数据
map
<int, string> m;
m.
insert
(make_pair(1, "one"));
m.emplace(2, "two");
m[3] = "three";
// 输出所有元素
for(const auto& p
:
m){
cout << p.first << "
:
" << p.second << endl;
return 0;
#### 查找特定项
为了高效地访问已存在的键对应的值,可以利用成员函数 `find()` 或者下标运算符[]
:
- 如果要检查某个键是否存在而不希望自动插入新条目,则应该优先考虑使用 `find()` 方法。
```cpp
if(m.find(someKey)!=m.end()){
// 键存在时
执行
的操作...
- 当确定键一定存在于集合内时可以直接通过下标获取其对应值;但如果不确定则可能引发未定义行为。
#### 删除指定位置处的节点
需要注意的是,在迭代过程中修改容器可能会导致迭代器失效从而引起程序
崩溃
或异常终止。因此建议先收集待移除项目的列表再统一处理它们[^2]
:
```cpp
vector<
map
<int,string>
:
:
iterator> toErase;
for(auto iter=m.begin();iter!=m.end();++iter){
if(/*条件*/){
toErase.push_back(iter);
// 反向遍历以安全删除多个连续项目
for(auto rit=toErase.rbegin();rit!=toErase.rend();++rit){
m.erase(*rit);
另外也可以采用更简洁的方式——即借助 erase-remove idiom 来完成相同任务:
```cpp
m.erase(remove_if(begin(m), end(m),
[](const pair<const int, string>& item){return /*条件*/;} ),
m.end());
以上就是关于 C++ STL 容器之一 —— `
map
` 类型的一些基础介绍及其常见应用场景下的编码实践[^1].