c++11
文章平均质量分 69
吃素的施子
这个作者很懒,什么都没留下…
展开
-
C++智能指针详解:shared_ptr
C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。使用 raw pointer 管理动态内存时,经常会遇到这样的问题:忘记delete内存,造成内存泄露。 出现异常时,不会执行delete,造成内存泄露。下面的代码解释了,当一个操作发生异常时,会导致delete不会被执行:void func(){ auto ptr = new Widget;原创 2021-12-19 14:52:26 · 19062 阅读 · 2 评论 -
C++智能指针之 auto_ptr和unique_ptr
auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有两大问题:1、复制和赋值会改变资源的所有权,不符合人的直觉。2、在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy constructable)和可赋值(assignable)。unique_ptr特性1、拥有它所指向的对象2、 无法进行复制构造,也无法进行复制赋值操作3、保存指原创 2021-12-19 11:00:56 · 312 阅读 · 0 评论 -
C++字符串拷贝:strncpy()和strncpy_s()区别
在掌握了strcpy函数和strcpy_s函数之后,我们不可避免地会谈到strncpy函数和strncpy_s函数,其实这四个函数的功能几乎一致,就是对两个字符串数组进行复制和赋值,但是具体实现有一点点区别。首先来说一下strncpy函数。该函数依然还是存在于标准名称空间std内,出现的目的很简单,对于strcpy函数,只能将两个字符串进行完整的复制和赋值,这里就会产生一个实际应用时的问题,如果我们只需要复制某个字符串的前几个字符呢?其实对于这个问题,我们首先可能会想到使用strcpy_s函数,因为转载 2021-09-26 18:27:41 · 1218 阅读 · 0 评论 -
C++字符串拷贝:strcpy()和strcpy_s()区别
在编写C++程序时,不可避免会遇到strcpy()函数和其安全版本strcpy_s()函数,其实之所以会推出_s版本的函数,就是为了使编程更加安全,然而为了保证安全,也就会更容易使我们编写的代码“被报错”。所以这里来简略说一下strcpy()函数和strcpy_s()函数的使用及注意事项。首先,我们知道原函数strcpy()函数和安全版本strcpy_s()函数都是存在于头文件<cstring>中的,所以程序一开始必须要有以下语句:#include <cstring>转载 2021-09-26 18:14:09 · 758 阅读 · 0 评论 -
如何用CTP接口开发自己的交易系统?(三)
接到上篇说哈,本文讨论一下数据监听线程和订单管理线程做些什么。一,数据监听线程数据监听线程,当行情处理线程接收到新的行情数据时,也就是每当一个tick到来时,就向数据监听线程发出信号,触发此线程启动,然后依次进行:1.各种指标计算,2.然后进行策略计算,3.最后在满足策略时进行交易。指标计算,就是指根据新到来的数据以及历史数据进行某些统计值的计算,比如常见的MA,MACD,RSI等,当然也可以自己构造出某个统计值。这里需要提到的是数据周期的问题(我在之前的博文中曾解释过)。如果...转载 2021-09-26 10:29:51 · 873 阅读 · 0 评论 -
如何用CTP接口开发自己的交易系统?(二)
本文开始先说说CTP给开发者提供了什么。CTP提供给开发者的文件一共有4个头文件 ThostFtdcTraderApi.h,ThostFtdcMdApi.h,ThostFtdcUserApiStruct.h,ThostFtdcUserApiDataType.h2个dll:thosttraderapi.dll,thostmduserapi.dll(动态链接库,如果是静态库则是thosttraderapi.lib,thostmduserapi.lib)。其中ThostFtdcTraderA...转载 2021-09-26 10:27:30 · 1614 阅读 · 0 评论 -
如何用CTP接口开发自己的交易系统?(一)
程序化交易系统是一个复杂的多线程网络程序,在开发过程中要特别注意处理很多的线程互斥、数据处理造成的网络丢包等一系列棘手问题。另外,对于CTP开发的资料,大家可以留言给我,我尽量提供,也欢迎大家多多讨论。自从综合交易平台(CTP)的API开放以来,很多人开始编写自己的程序化交易系统,今天我想说说自己的一些看法。首先解读一下CTP的接口说明,CTP的API使用建立在TCP协议之上FTD协议(《期货交易数据交换协议》)与交易托管系统进行通讯,而交易托管系统负责投资者的交易业务处理。FTD协议中规定了...转载 2021-09-26 10:23:02 · 5441 阅读 · 0 评论 -
C++中 std::vector 的6种初始化方法
1.vector<int> list1; 默认初始化,最常用此时,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。 这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。2.vector<int> list2(list); 或者 vector<int> ilist2 = ilist; //拷贝初始化 ,"="两种方式等价 , list2 初始化为list 的拷贝, list必须与li.原创 2021-08-25 14:22:30 · 38878 阅读 · 0 评论 -
C++使用vector.clear()方法注意事项
void clear():删除存储在vector中的所有元素一、 1.如果vector的元素是一些object,则它将为当前存储的每个元素调用它们各自的析构函数。 2.如果vector存储的是指向对象的指针,此函数并不会调用到对应的析构函数。会造成内存泄漏。想要删除vector中的元素则应遍历vector使用delete,然后再clear for(int i = 0; i < vec.size(); ++i) { delete vec[i]; }原创 2021-08-25 10:36:52 · 9625 阅读 · 0 评论 -
C++11在linux编译中出现“‘typeof’ was not declared in this scope“ 错误解决
下面这段代码:int main(void){ int a = 10; typeof(a) b = a + 1;}在g++5.4中默认编译可通过,但是若加上c++11选项就编译出错。这是因为typeof是GNU扩展,而不是C++标准。最简单的解决办法是使用gnu++11,而非c++11。g++ a.cpp -std=gnu++11...原创 2021-08-12 16:40:13 · 2889 阅读 · 0 评论 -
剖析std::find_if ()的实现方法
最近的项目中标准库函数的使用比较频繁,很多博文都停留在套用层次,我是一个比较爱深究的人,闲暇之余查阅了很多文档。终于找到了满足我好奇心的解释。实际上像std::find_if() std::for_each() 这样的函数就是简单的for循环,为了让我们少些代码而已。让我们一起揭开std::find_if() 神秘面纱。它的定义大致这样的:template<class InputIterator, class UnaryPredicate> InputIterator fin..原创 2021-07-20 20:08:52 · 1248 阅读 · 0 评论 -
时间复杂度 O(log n) 能说明什么?
预先知道算法的复杂度是一回事,了解其后的原理是另一件事情。不管你是计算机科班出身还是想有效解决最优化问题,如果想要用自己的知识解决实际问题,你都必须理解时间复杂度。先从简单直观的 O(1) 和 O(n) 复杂度说起。O(1) 表示一次操作即可直接取得目标元素(比如字典或哈希表),O(n) 意味着先要检查 n 个元素来搜索目标,但是 O(log n) 是什么意思呢?你第一次听说 O(log n) 时间复杂度可能是在学二分搜索算法的时候。二分搜索一定有某种行为使其时间复杂度为 log n。我们来看看原创 2021-07-20 14:59:36 · 510 阅读 · 0 评论 -
递归锁与非递归锁
1 可递归锁与非递归锁1.1 概念在所有的线程同步方法中,恐怕互斥锁(mutex)的出场率远远高于其它方法。互斥锁的理解和基本使用方法都很容易,这里不做更多介绍了。Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。可递归锁也可称为可重入锁(reentrant mutex),非递归锁又叫不可重入锁(non-reentrant mutex)。二者唯一的区别是,同一个线程可以多次获取同一个递归锁,不会产生死锁。而如果一个线程...原创 2020-12-21 16:36:01 · 1695 阅读 · 0 评论 -
c++匿名函数(lambda表达式)的使用方法
1、匿名函数的使用匿名函数的基本语法为://[捕获列表](参数列表)->返回类型{函数体}int main(){ auto Add = [](int a, int b)->int { return a + b; }; std::cout << Add(1, 2) << std::endl; return 0;}上述代码便会输出3,这就是匿名函数的使用方法。注意点:一般情况下,编译器可以自动推断出lambda表达式的返回类型,所以我.原创 2020-11-11 16:09:23 · 1007 阅读 · 0 评论 -
C++11条件变量:notify_one()与notify_all()的区别
notify_one()与notify_all()常用来唤醒阻塞的线程。notify_one():因为只唤醒等待队列中的第一个线程;不存在锁争用,所以能够立即获得锁。其余的线程不会被唤醒,需要等待再次调用notify_one()或者notify_all()。notify_all():会唤醒所有等待队列中阻塞的线程,存在锁争用,只有一个线程能够获得锁。那其余未获取锁的线程接着会怎么样?会阻塞?还是继续尝试获得锁? 答案是会继续尝试获得锁(类似...原创 2020-11-10 18:55:58 · 29585 阅读 · 10 评论 -
因为这7个C++的坑,整个团队加班一星期
近期我们团队进行版本质量加固时,踩到了一些比较隐晦的C++的坑,特总结分享在此,供大家参考。1. string的字符串拼接,导致coredump该问题的核心点在于第9行,竟然是可以编译通过,其原因是x+"-",会被转成char*,然后与to_string叠加导致BUG。2. map的迭代器删除map要删除一个元素,通常通过erase()函数来完成,但是要注意,如果我们传入了一个iterator作为erase的参数来删除当前迭代器所指向的元素,删除完成后iterator会失效,产生未定义行转载 2020-11-09 10:15:09 · 295 阅读 · 0 评论 -
C++11异常处理关键字:noexcept
断言(assertion)是一种编程中常用的手段。相比于断言适用于排除逻辑上不可能存在的状态,异常通常是用于逻辑上可能发生的错误。在C++98中,我们看到了一套完整的不同于C的异常处理系统。通过这套异常处理系统,C++拥有了远比C强大的异常处理功能。下面来一起了解一下吧。C++11开始,我们能看到很多代码当中都有关键字noexcept。比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept。 constexpr initializer_list(原创 2020-11-03 18:33:11 · 680 阅读 · 0 评论 -
C++11 中的 override 关键字使用
在派生类中,重写 (override) 继承自基类成员函数的实现 (implementation) 时,要满足如下条件:一虚:基类中,成员函数声明为虚拟的(virtual)二容:基类和派生类中,成员函数的返回类型和异常规格(exception specification) 必须兼容四同:基类和派生类中,成员函数名、形参类型、常量属性(constness) 和引用限定符(reference qualifier) 必须完全相同 如此多的限制条件,导致了虚函数重写如上...原创 2020-09-21 16:39:00 · 247 阅读 · 0 评论 -
C++ log日志:google的glog
GLog 是一个应用程序级的日志记录的库,它提供了基于C++样式流和各种帮助程序宏的日志记录API,你可以很简单的将信息传输到LOG来记录消息。文章目录 下载安装 严重程度 日志格式 设置 设置存放Log的目录 设置只在终端显示Log 设置记录Log到本地以及终端显示 设置记录到stderr的log的级别 设置需要记录log的级别 条件记录 周期记录 条件加周期记录 限制Log输出次数 支持调试模式 崩溃处理 ...原创 2020-09-15 17:49:13 · 4380 阅读 · 0 评论 -
C++的Boost库:asio::io_context 替换掉asio::io_service的问题
新版 ASIO 必须以asio::io_context替换asio::io_serviceio_context -> io_service io_context.post() -> io_context.get_executor().post() io_context.dispatch() -> io_context.get_executor().dispatch() io_context::strand -> strand<io_context::execut...原创 2020-09-14 13:42:42 · 6923 阅读 · 0 评论 -
C++ 死锁问题发生的条件
定义:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。示例:一,忘记释放锁mutex _mutex;void func(){ _mutex.lock(); if (xxx) return; _mutex.原创 2020-08-20 19:09:27 · 261 阅读 · 0 评论 -
jsoncpp:C++ JSON 库的使用方法
jsoncpp主要包含三个class:Value、Reader、Writer。注意Json::Value只能处理ANSI类型的字符串,如果C++程序是用Unicode编码的,最好加一个Adapt类来适配。Json内部类和方法: Reader<是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的> 【构造函数】 1、Reader(); 【拷贝构造函数】 2、Reader( co...转载 2020-08-13 12:51:18 · 1331 阅读 · 0 评论 -
C++11:原子交换函数compare_exchange_weak和compare_exchange_strong
我们知道在C++11中引入了mutex和方便优雅的lock_guard。但是有时候我们想要的是性能更高的无锁实现,下面我们来讨论C++11中新增的原子操作类Atomic,我们可以利用它巧妙地实现无锁同步。CAS(Compare and Swap)是个原子操作,保证了如果需要更新的地址没有被他人改动多,那么它可以安全的写入。而这也是我们对于某个数据或者数据结构加锁要保护的内容,保证读写的一致性,不出现dirty data。现在几乎所有的CPU指令都支持CAS的原子操作。AtomicC+...原创 2020-06-30 10:41:23 · 43763 阅读 · 11 评论