首页 > 其他分享 >记录一次使用unordered_set插入数据异常的问题

记录一次使用unordered_set插入数据异常的问题

时间:2024-04-01 19:11:06浏览次数:24  
标签:set defined 代码 插入 task variable unordered

问题描述

问题和 unordered_set 有关,相关代码如下:

//打印unordered_set的所有值
void printSet(const std::unordered_set<std::string> &data)
{
    int index = 0;
    auto it = data.begin();
    for (; it != data.end(); ++it)
    {
        const std::string& key = *it;
        EASE_ERROR("%d:%s", index++, key.c_str());
    }
}

...//其他业务代码
    
std::unordered_set<std::string> defined_task_variable;//数据定义

defined_task_variable.emplace(task_variable);	//插入代码
printSet(defined_task_variable);				//打印所有值

这些代码作为so提供给 程序A 调用,但是程序执行过程中发现,defined_task_variable 插入值后,printSet()方法应该遍历defined_task_variable,打印出其内部数据的,但实际上其打印出来的都是(null),且只在arm平台出现,且必现,但x86一切正常

排查思路

1、怀疑是线程资源冲突

相关操作函数增加线程id打印,确定是单线程,排除

2、怀疑是局部变量task_variable被释放

首先,unordered_set的emplace方法采用完美转发,不可能因为传入参数生命周期结束而导致没有值

其次,修改代码,emplace插入纯字符串,发现问题依然,排查

3、怀疑是程序A的问题

编写测试程序B,加载同一个so

此时,测试发现一个奇怪的现象。首先,x86依然正常,但是arm平台出现两种情况:

测试程序B因为代码量小,编译出来的结果在1M以下,运行正常;此时,相同的程序B再额外加上一些代码(这些代码没有用到),导致编译出来的二进制文件大小达到24M,此时运行,复现错误

什么原因呢?运行的问题出现在so中,但是却是调用so的二进制文件大小决定问题是否出现。有点诡异啊。

最终,仍然没有找到根本原因,但是既然文件大小会影响运行结果,那么减小文件是不是就可以避免了呢?

3.1、二进制文件大小

编译时加入编译器优化选项,使用-O3

set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -O3  -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3  -Wall")

原本编译出来的程序A大小从20多M,降到了5M,运行正常,算是暂时解决了这个问题,但是因为使用了编译器优化,会不会导致逻辑不达预期,需要进一步测试

总结

那么,造成此问题的原因究竟是什么呢?

标签:set,defined,代码,插入,task,variable,unordered
From: https://www.cnblogs.com/sherlock-lin/p/18109187

相关文章

  • 查询插入
    INSERTINTOT_AREACODE_ISP_SORT(ID,[BEIANDIQU_CODE],[REGION_CODE],[ISP_GUID],[SERIAL_NUMBER],[CREATE_TIME],[MODIFY_TIME])selectnewid(),'x90009',AREACODE,'9C84C5D5-5C73-45B5-9......
  • setuptools 对于现代python包支持的简单试用
    以前我们编写python包通过setuptools是编写配置setup.cfg以及一个setup.py文件,现代的玩法是基于pyproject.toml以下是一个简单学习项目准备使用venvclipython-mvenvvenvsourcevenv/bin/activate创建项目文件pyproject.toml,里边包含了build......
  • 向数据库插入打卡数据
    importandroid.util.Log;importcom.example.demo3.entity.Record;importcom.example.demo3.utils.JDBCUtils;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;......
  • 向数据库插入计划数据
    publicclassPlanningDao{privatestaticfinalStringTAG="mysql-db_timing-PlanningDao";publicPlanningDao(){//在构造函数中初始化必要的操作,如果有的话}//方法:插入目标数据publicstaticbooleaninsertGoal(Planningplannin......
  • 【每周例题】力扣 C++ 搜索插入位置
    搜索插入位置题目搜索插入位置 题目分析1.第一个想法肯定是暴力遍历,找到了就输出下标,找不到就对比前后两个数字,寻找合适的位置插入。2.需要注意一点,我们需要再一开始就对比target与数组最后一个数的大小,如果比数组最后一个数大,直接返回数组长度3.第二个想法就是缩短寻找的......
  • unordered_map
    \(unordered\_map\)的\(hash\)函数固定易被卡,于是采用自定义随机哈希函数\(custom\_hash\)。structcustom_hash{staticuint64_tsplitmix64(uint64_tx){x+=0x9e3779b97f4a7c15;x=(x^(x>>30))*0xbf58476d1ce4e5b9;x=(x^(x......
  • SQL数据插入操作详解,让你不再迷茫
    一、SQL数据插入操作简介1.1数据插入的作用SQL数据插入操作是SQL语言最基础、也是最常用的数据库操作之一。它用于向表中插入新的数据行或更新现有的数据行,是构建和维护数据库的重要手段之一。1.2插入数据的基本语法要执行数据插入操作,需使用INSERTINTO语句,语法如下:I......
  • Set集合
    1、set的定义Set,不允许出现重复元素,并且无序的集合,主要有HashSet实现类在判断重复元素的时候,Set集合会调用HashCode()和equal()方法来实现。注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素用于存储(存入无序和取出的顺序不一定相同)元素,值......
  • Babylon 如何使用AssetsManager(),导入多个模型
    AssetsManager是Babylon.js资产管理工具,可以加载多个模型或者纹理,并且在任务完成时提供回调函数。例如://创建一个AssetsManager实例constassetsManager=newBABYLON.AssetsManager(scene);//添加纹理加载任务consttextureTask=assetsManager.addTexture......
  • 代码随想录第22天 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.
    235. 二叉搜索树的最近公共祖先 235.二叉搜索树的最近公共祖先-力扣(LeetCode)代码随想录(programmercarl.com)二叉搜索树找祖先就有点不一样了!|235.二叉搜索树的最近公共祖先_哔哩哔哩_bilibili给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百......