c++
c++ something
南城小金刚
明月照大江
展开
-
boost::geometry简介,真香
几何库,OGC,GIS,计算机图形原创 2022-04-13 14:40:22 · 6363 阅读 · 0 评论 -
c++ fstream中的坑
std::ofstream ofs(fpath);目录不存在原创 2022-04-06 19:23:53 · 1814 阅读 · 0 评论 -
c++删除已打开的文件
已打开文件和其所在目录,能否删除呢?原创 2022-04-06 18:24:39 · 2272 阅读 · 0 评论 -
std::sort使用const iterator引发的编译错误
no matching function for call to 'swap'原创 2022-02-11 17:16:39 · 1512 阅读 · 0 评论 -
std::future多次get发生崩溃
std::future为一次性事件多次使用发生崩溃原创 2022-02-08 16:59:50 · 1440 阅读 · 0 评论 -
记录一次app崩溃信息调试
崩溃,armv8,反汇编,多线程原创 2022-01-29 18:06:00 · 1534 阅读 · 0 评论 -
返回值与线程安全
返回值,锁,调用者原创 2022-01-28 17:23:51 · 996 阅读 · 0 评论 -
c++函数调用追踪
函数调用追踪,__cyg_profile_func_enter,-finstrument-functions原创 2022-01-25 19:59:46 · 1812 阅读 · 0 评论 -
设计模式-单例模式
单例模式原创 2022-01-21 18:15:15 · 655 阅读 · 0 评论 -
c++17标准适配问题
c++17编译问题原创 2022-01-21 18:00:22 · 8941 阅读 · 0 评论 -
线程安全与锁使用-注意事项
增加注释增加与线程安全相关的注释在示例1,函数描述中说明了线程安全。同时说明了该函数存在的风险。_renderMutex是递归锁anchorP->SetInfoWindowImageData会回调AnchorLayer中的持_renderMutex的成员函数(反回调)子调用addAnchorPoint中持有_renderMutex锁示例1 /** * @brief:导致使用[递归锁],反回调,thread-safe * @para原创 2022-01-21 16:47:00 · 3304 阅读 · 0 评论 -
c++ 模板由已知类型推导出关联类型
c++ 模板由已知类型推导出关联类型原创 2022-01-05 18:40:51 · 382 阅读 · 0 评论 -
c语言 宏定义嵌套
c语言中的宏定义是支持嵌套的,如下两个代码,无论宏定义的先后顺序,都是可以的。#define b_print a_print#define a_print cout << "a" << endlint main(){ b_print; return 0;}#define a_print cout << "a" << endl#define b_print a_printint main(){ b_print; return 0;原创 2022-01-05 17:53:08 · 3741 阅读 · 0 评论 -
c++条件变量-注意事项
c++条件变量注意事项原创 2022-01-05 17:48:46 · 1047 阅读 · 0 评论 -
请你不要再用vector[vector.size()-1]来表示最后一个元素了
vector.front()vector.back()原创 2022-01-04 10:06:05 · 2831 阅读 · 0 评论 -
c语言可变参数与日志打印
可变参数与日志打印原创 2021-12-22 11:16:56 · 860 阅读 · 0 评论 -
qt QFile.rename失败
QFile中的rename在下面情况下会rename失败文件被打开新文件名在目录下已存在新文件名没有写全路径假设C:\Users\95163\Desktop目录下有icmp.pcap, icmp1.pcap两个文件,则执行结果如下 QFile f("C:\\Users\\95163\\Desktop\\icmp.pcap"); f.open(QFile::Append); //失败,文件已被打开 f.rename("C:\\Users\\95163\\Desktop\\icmp2.pcap"原创 2021-03-22 19:36:56 · 3857 阅读 · 0 评论 -
boost.asio异步调用使用智能指针
boost.asio中的异步async_*函数需要传入回调函数参数,如果回调函数使用lamda表达式,在’capture’列表中传入智能指针,智能指针会生效吗?在async_connect调用之前,我们创建一个shared_ptr对象,并以值传入的形式放到lamda的’caputer’列表中,最后发现shared_ptr在async_connect的异步回调函数完成后析构了其管理的对象,可见其是生效的。其实最好还是用uinque_ptr,但lamda中不支持move捕获。测试代码如下:class L原创 2021-02-20 08:50:49 · 489 阅读 · 0 评论 -
boost.asio的async_write_some存在的坑
boost.asio的async_write_some看起来很方便,但使用起来很复杂,主要有两个方面:async_write_some经常与io_context不在同一线程,async_write_some同一时刻只能由一个线程调用,需要加锁,同时需要与io_context所在线程的其他异步方法同步,如关闭sock的时机。当对方一直不读取缓冲区,就会造成本方的socket发送缓冲区爆满,此种情况需要怎样处理?第一种情况就需要根据业务情况加各种锁了。现在只讨论当对方一直不读缓冲区的情况。测试如下s原创 2021-02-19 11:39:10 · 4191 阅读 · 1 评论 -
boost.asio中socket异步关闭流程
boost.asio中的socket异步方法,需要检测std::error_code来关闭连接,那如何正常关闭tcp连接呢。下面的模拟测试中:1.server端在读取client端发送的第一个1024字节流后,关闭连接。2.client端在另一个线程发送第一个1024字节流后,sleep1秒,再发送第二个1024字节流。结果:1.server端在关闭socket后,其异步方法会检测到错误。2.client端的第二次发送也会检测到错误。所以通过正常的错误处理,两端可以及时地关闭tcp连接。可以得原创 2021-02-19 11:14:46 · 2567 阅读 · 0 评论 -
c/c++动态指定sprintf字符串的宽度
sprintf函数可用*号指定字符串的长度 int width = 8; char *buf = new char[width+1]; sprintf(buf, "%0*d", width, 1); cout << buf << endl; delete buf;输出结果:00000001原创 2021-02-19 08:50:43 · 1489 阅读 · 0 评论 -
scalar deleting destructor(unsigned int)
在使用vs调试时,析构函数执行时在’scalar deleting destructor’的位置报错,怀疑是指针被delete了多次,但最后发现是”被释放的内存存在越界问题“,比较难发现。问题简要如下class MemCorrupt {public: typedef std::unique_ptr<char[]> char_ptr_t; MemCorrupt() { ptr_ = char_ptr_t(new char[8]); sprintf(ptr_.get(),"%08d"原创 2021-02-19 08:45:36 · 3415 阅读 · 0 评论 -
c++ chrono 获取以ms为单位的时间戳
c++中的chrono可以获得epoch时间戳,即获得从1971.1.1零时开始的时间戳。核心就是用chrono::system_clock::now(),获取当前的时间,再进行如下转换#include <iostream>#include <chrono>using namespace std;int main(){ auto ms = chrono::duration_cast<chrono::milliseconds>(chrono::system原创 2021-01-27 16:32:47 · 4625 阅读 · 0 评论 -
c++中int32,int64等类型的最大最小值
c++中的头文件中 包含了各数字类型的极限值,使用起来挺方便的。#include <iostream>#include <limits>using namespace std;template<typename T>static void _PrintLimit(const char *desc, const T &num) { cout << desc << "=" << num << "\t";}原创 2021-01-27 15:25:18 · 18588 阅读 · 0 评论 -
c/c++ uin32相乘赋值给uint64的变量精度丢失
有一个uint32_t的整数1611660692,将其乘1000后,发现得到的数值为1047956000,而不是1611660692000。过程如下uint32_t a = 1611660692;uint64_t b = a * 1000;这种情况下,得到b的值为1047956000。右边先将结果转换为uint32_t的,再将uint32_t转换为uint64_t的,所以造成精度丢失。如果像下边这么写就没问题了uint32_t a = 1611660692;uint64_t b = stati原创 2021-01-27 10:02:26 · 1299 阅读 · 0 评论 -
c++ boost 加载文件到字符串
c++标准中没有一个api可以加载文件到string类型,网上都说的是先用ostringstream中转下,今发现了boost中有一个这样的api,用着挺好用,注意捕捉异常。#include<boost/filesystem.hpp>#include<iostream>using namespace std;string strRet;string path="/root/hello.txt";try { boost::filesystem::load_string原创 2021-01-26 14:05:24 · 554 阅读 · 0 评论