c/c++
文章平均质量分 68
小麒麟666
这个作者很懒,什么都没留下…
展开
-
C++11智能指针(六):unique_ptr介绍与例子
本节介绍下c++11提供的智能指针实现: std::unique_ptr<>什么是std::unique_ptrunique_ptr <>是c ++ 11提供的智能指针实现之一,用于防止内存泄漏。unique_ptr对象包含一个原始指针,并负责其生命周期。当这个对象被销毁的时候,它的析构函数会删除关联的原始指针。unique_ptr有重载的- >和*运算符,所以它可以...原创 2018-02-12 10:31:10 · 11583 阅读 · 1 评论 -
C++Primer第五版中的c++11特性归纳(五)
四十一、auto不能用于分配数组虽然我们用空括号对数组中的元素进行值初始化,但不能在括号中给出初始化器,这意味着不能用auto分配数组。四十二、动态分配数组的列表初始化在新标准中,我们可以提供一个元素初始化器的花括号列表://10个int分别用列表中对应的初始化器初始化int *pia = new int[10]{0,1,2,3,4,5,6,7,8,9};//10个string,前4个用给定的...原创 2017-12-21 15:17:50 · 561 阅读 · 0 评论 -
C++Primer第五版中的c++11特性归纳(六)
五十一、通过定义类为final来阻止继承有时我们会定义这样一种类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类。为了实现这一目的,C++11新标准提供了一种防止继承的方法,即在类名后面跟一个关键字final:class NoDerived final {/**/}; //NoDerived不能作为基类五十二、虚函数的override和final指示符在c++1原创 2017-12-21 15:19:18 · 705 阅读 · 1 评论 -
c++11多线程编程(六):事件处理
本节讨论在多线程环境下的事件处理有时,线程需要等待某事件发生,比如一个条件变为true,或者某任务被另一个线程完成例如,我们创建一个基于网络的应用程序,处理如下的任务:1、与处理器进行一些握手操作;2、从xml文件load数据;3、处理从xml文件load的数据.可以发现,任务1不依赖其他的任务,而任务3则依赖于任务2,这意味着任务1和任务2可以由不同的线程并行运行,以提升原创 2017-11-23 10:24:00 · 5442 阅读 · 2 评论 -
c++11多线程编程(七):条件变量说明
条件变量条件变量是一种用于在2个线程之间进行信令的事件,一个线程可以等待它得到信号,其他的线程可以给它发信号。在c++11中,条件变量需要头文件:#include 同时,条件变量还需要一个mutex锁条件变量实际上是如何运作的·线程1调用等待条件变量,内部获取mutex互斥锁并检查是否满足条件;·如果没有,则释放锁,并等待条件变量得到发出的信号(线程被阻塞),条原创 2017-11-23 10:41:38 · 3599 阅读 · 0 评论 -
C++Primer第五版中的c++11特性归纳(二)
十一、vector对象的列表初始化c++11新标准提供了另外一种为vector对象的元素赋初值的方法,即列表初始化。此时,用花括号括起来的0个或多个元素值被赋给vector对象:vector v1 = {"a", "an", "the"}; //列表初始化vector v2 = ("a", "an", "the"); //错误 十二、容器的cbegin和cend函数begin和e原创 2017-12-10 14:52:19 · 836 阅读 · 0 评论 -
C++Primer第五版中的c++11特性归纳(一)
C++Primer第五版对C++11的特性做了详细的介绍,现在对其做一个大致的归纳一、long long类型在C++11中,标准要求long long整型可以在不同平台上有不同的长度,但至少有64位。我们在写常数字面量时,可以使用LL后缀(或是ll)标识一个long long类型的字面量,而ULL(或ull、Ull、uLL)表示一个unsigned long long类型的字面原创 2017-12-10 14:45:18 · 1537 阅读 · 0 评论 -
c++11多线程编程(八):std::future , std::promise和线程的返回值
std::future对象可以和asych,std::packaged_task,std::promise一起使用。这篇文章集中讨论std::future和std::promise。我们经常会遇到需要得到线程返回结果的情况,现在的问题是我们如何实现。举个例子:假设在程序中,我们创建了一个压缩给定文件夹的线程,并且我们希望该线程能够返回新的zip文件的名称和大小。有两种实现方式:原创 2017-11-30 15:07:08 · 17247 阅读 · 9 评论 -
c++11多线程编程(五):使用mutex修复竞争
c++11多线程编程(五):使用mutex修复竞争这节我们讨论怎样使用mutex锁保护多线程环境中的共享数据来避免竞争条件为了修复多线程环境中的竞争条件,我们需要mutex互斥锁,在修改或读取共享数据前,需要对数据加锁,修改完成后,对数据进行解锁。在c++11的线程库中,mutexes在头文件中,表示互斥体的类是std::mutexmutex有两个重要的方法:1.) l原创 2017-11-17 14:45:42 · 2221 阅读 · 4 评论 -
c++11多线程编程(四):数据共享和竞争条件
在多线程环境中,线程间的数据共享很简单,但是在程序中这种简单的数据共享可能会引起问题,其中一种便是竞争条件什么是竞争条件?竞赛条件是发生在多线程应用程序中的一种bug当两个或多个线程并行执行一组操作,访问相同的内存位置,此时,它们中的一个或多个线程会修改内存位置中的数据,这可能会导致一些意外的结果,这就是竞争条件竞争条件通常较难发现并重现,因为它们并不总是出现,只有当两个或多个原创 2017-11-17 14:36:41 · 4329 阅读 · 3 评论 -
c++11多线程编程(二):joining和detaching 线程
Joining线程线程一旦启动,另一个线程可以通过调用std::thread对象上调用join()函数等待这个线程执行完毕std::thread th(funcPtr); th.join();看一个例子:主线程启动10个工作线程,启动完毕后,main函数等待他们执行完毕,joining完所有线程后,main函数继续执行#include #include #inc原创 2017-11-03 14:46:00 · 3950 阅读 · 1 评论 -
c++11多线程编程(一):创建线程的三种方法
c++11线程库原始的c++标准仅支持单线程编程,新的c++标准(c++11或c++0x)于2011年发布,引入了新的线程库。编译器要求:Linux: gcc 4.8.1 (完全并发支持)Windows: Visual Studio 2012 and MingW在linux下的编译方法:g++ -std=c++11 sample.cpp -lpthread原创 2017-11-03 14:45:08 · 43781 阅读 · 7 评论 -
C++Primer第五版中的c++11特性归纳(三)
二十一、使用decltype简化返回类型定义如果我们知道函数返回的指针指向哪个数组,就可以使用decltype关键字声明返回类型。例如,下面的函数返回一个指针,该指针根据参数i的不同指向两个已知数组中的某一个int odd[] = {1,3,5,7,9};int even[] = {0,2,4,6,8};//返回一个指针,该指针指向含有5个整数的数组decltype(odd) *ar原创 2017-12-14 15:36:23 · 530 阅读 · 0 评论 -
C++Primer第五版中的c++11特性归纳(四)
三十一、容器的非成员函数swap在新标准库中,容器既提供成员函数版本的swap,也提供非成员版本的swap。而早期标准库版本只提供成员函数版本的swap。非成员版本的swap在泛形编程中是非常重要的。统一使用非成员版本的swap是一个好习惯。三十二、容器insert成员的返回类型在新标准下,接受元素个数或范围的insert版本返回指向第一个新加入元素的迭代器。(在旧版本中,这些原创 2017-12-14 15:36:53 · 567 阅读 · 0 评论 -
C++11智能指针(四):创建shared_ptr对象
1、尽量不要使用相同的原始指针来创建多个shared_ptr对象,因为在这种情况下,不同的shared_ptr对象不会知道它们与其他shared_ptr对象共享指针。这样会造成什么样的问题?设想两个shared指针由相同的原始指针创建:int *rawPtr = new int();std::shared_ptr<int> ptr_1(rawPtr);std::shared_ptr...原创 2018-02-11 16:49:52 · 7567 阅读 · 0 评论 -
c++11智能指针(三):shared_ptr和指针
本节对比一下C++11智能指针的实现shared_ptr和普通的指针从以下几个方面比较:++,--和[]操作符相比于原始指针,shared_ptr只提供这些运算符:1) ->, *2) 比较运算符但是,shared_ptr不提供1) 指针运算比如+,-,++,--2) Operator []例子:#include <iostream>#include <memory>...原创 2018-02-09 11:53:27 · 1559 阅读 · 0 评论 -
c++11智能指针(二):shared_ptr和自定义的Deleter
本节讨论怎样使用 std::shared_ptr自定义Deleter.当一个shared_ptr对象超出作用域时,其析构函数被调用,在析构函数中,将其引用计数减1,如果引用计数的值变为0,则删除关联的原始指针。要删除析构函数中的内部原始指针,默认情况下,shared_ptr调用delete()函数,即delete Pointer;但是,我们在析构函数中并不总是要使用delete函数,还可能有其他的...原创 2018-02-06 17:48:30 · 16659 阅读 · 2 评论 -
C++11智能指针(一):shared_ptr介绍与实例
什么是std::shared_ptr<>?std::shared_ptr<>是c++11中引入的一种智能指针,它足够聪明,如果指针不在任何地方使用,就会自动删除指针。这可以帮助我们彻底消除内存泄露和悬挂指针的问题。shared_ptr和共享所有权它遵循共享所有权的概念,即不同的shared_ptr对象可以与相同的指针相关联,并且在内部使用引用计数机制来实现。每个shared...原创 2018-02-05 15:16:55 · 7268 阅读 · 0 评论 -
C++11智能指针(五):shared_ptr的循环引用的问题及weak_ptr
shared_ptr的主要优点是当不再使用时会自动释放相关的内存。但是如果我们不仔细使用shared_ptr,那么这个优势就会变成一个劣势。 我们来看看:假设我设计一个二叉树,并在其中包含一个指向左右子节点的指针。#include <iostream>#include <memory>class Node { int value; public: std::...原创 2018-02-12 10:30:27 · 8907 阅读 · 4 评论 -
linux下使用zookeeper C API开发zookeeper应用的方法介绍
1、配置开发环境构建ZooKeeper本地库的最简单的方式是使用ant构建工具。在你解压缩的ZooKeeper发行包的目录中,有一个名为build.xml的文件,该文件包含了ant构建所需的构建步骤。你还需要用到automake、autoconf和cppunit这些工具,如果你使用Linux操作系统,需要确保这些工具在你的主机中可用。一旦安装了所有必需的工具,你可以采用以下方式构建ZooKeepe原创 2018-01-18 10:30:27 · 4211 阅读 · 0 评论 -
zookeeper C API 完整运行实例
介绍下每个组件代码流摘要Master:1、获取leadership前2、尝试创建主znode3、如果通过,则获取leadership4、连接丢失后,需要检查znode是否存在以及谁拥有它5、一旦确定他人拥有它,Watch主znode6、获取leadership后7、Get workers8、在worker list上设置一个watcher9、检查原创 2018-01-24 14:54:38 · 3470 阅读 · 0 评论 -
RabbitMQ C 客户端收发数据实例解析
rabbitmq-c客户端,github地址:https://github.com/alanxz/rabbitmq-crabbitmq-c是一个C语言操作的AMQP客户端库,用来与RabbitMQ broker进行交互Building and installing:需要:CMake2.6或以上版本1、下载安装包后解压,进入主目录,2、mkdir build && cd build ...原创 2018-03-02 18:42:48 · 17728 阅读 · 11 评论 -
c++11多线程编程(十):packaged_task<>介绍与实例
本节讨论c++11中std::packaged_task的特性与使用方法std::packaged_taskstd::packaged_task是一个类模板,代表一个异步任务。封装了1、可调用实体,即函数,lambda函数或函数对象2、一个共享状态,通过关联的回调来存储返回的值或抛出的异常。假设我们有一个现有的函数从数据库中提取数据并返回,//从DB获取数据std原创 2017-12-27 10:36:35 · 3615 阅读 · 0 评论 -
c++11多线程编程(九):std::async介绍与实例
本节讨论下在C++11中怎样使用std::async来执行异步task。C++11中引入了std::async什么是std::asyncstd::async()是一个接受回调(函数或函数对象)作为参数的函数模板,并有可能异步执行它们.templatefuture::type> async(launch policy, Fn&& fn, Args&&...args);std原创 2017-12-27 10:33:37 · 35081 阅读 · 2 评论 -
c++11多线程编程(三):仔细地将参数传递给线程
要将参数传递给线程的可关联对象或函数,只需将参数传递给std::thread构造函数默认情况下,所有的参数都将复制到新线程的内部存储中看一个例子:给线程传递单个参数#include #include #include void threadCallback(int x, std::string str){ std::cout<<"Passed Number = "<原创 2017-11-11 15:31:30 · 8101 阅读 · 2 评论 -
c++通过Thrift向flume发送数据
在flume源码包apache-flume-1.7.0-src\flume-ng-sdk\src\main\thrift\flume.thrift 目录下,有Flume的Thrift接口定义(IDL)语言,通过该Thrift可以生成客户端模块基础代码,此处我们生成相应的c++代码:thrift -r --gen cpp flume.thrift编译过程中可能会报 "libthrift-0.9.原创 2017-09-15 17:22:43 · 833 阅读 · 0 评论 -
C++11: g++-4.7 internal compiler error 解决方法
在linux虚拟机下编译文件时,出现如下错误:C++11: g++-4.7 internal compiler error检查程序很久没有找出问题,最后发现居然是虚拟机运行内存不够了大量template的扩展需要足够的内存,把虚拟机的内存分配多一些即可解决问题原创 2016-06-06 17:42:15 · 2533 阅读 · 0 评论 -
linux下利用gsoap实现webservice通信方法详解
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,在数据接入其他平台,如C#、JAVA实现的一些webservice服务,在需要将数据对接其他设备的应用中,gSOAP可以为开发提供很大方便。 一般的,一个webservice服务端,会提供一个wsdl文件、一个接入的url地址和一份对应的字段定义文档,有了这些资料,就可以使用gSOAP进行webservi原创 2014-11-06 18:25:20 · 3837 阅读 · 0 评论 -
linux环境下使用webservice对接数据过程中的报错总结
在利用gSOAP对接webservice时,由于跨语言对接,在对接过程中往往会遇到一些难以排查的问题,在调用平台提供的webservice接入文件wsdl中定义的接口函数时,根据返回值,可以大致判断出出错的类型,其中,较为常见的有SOAP_OK 0SOAP_TAG_MISMATCH 3SOAP_FAU原创 2014-12-02 18:32:20 · 4472 阅读 · 0 评论 -
采用gsoap方式的webservice对接,soap绑定与http绑定的差异
使用gsoap方式向服务器发送webservice数据时,用soupUI测试时,soap调用返回值0,表明数据发送成功但是在项目现场对接基于同一WSDL文件的平台时,soap调用返回值12(SOAP_FAULT),通过wireshark抓包发现有如下错误信息:Could not find an appropriate Transport Binding to invoke错原创 2016-01-07 20:37:04 · 4148 阅读 · 0 评论 -
linux环境下gsoap调用过程中的超时设置
linux环境下,使用gsoap方式对接webservice,在网络环境较差的情况下,会出现数据停止上传的情况,排查发现,线程卡在了调用gsoap接口的地方没有返回值了解决方法是设置gsoap的超时时间,默认的超时时间配置都是0,即阻塞方式: memset(&m_SoapClient, 0, sizeof(struct soap)); soap_init(&m_SoapClient原创 2016-01-15 17:48:10 · 2095 阅读 · 0 评论 -
socket阻塞与非阻塞,同步与异步、I/O模型
转自:http://blog.csdn.net/hguisu/article/details/74533901. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返转载 2016-01-15 17:40:57 · 763 阅读 · 0 评论 -
UDP客户端实现在不同端口上发送和接收数据
普通udp通信,客户端在发送完数据后,只需要在相同socket上,recvfrom即可服务端给的回应,可以是同一端口,也可以是不同端口,客户端在接收时,需要指点一个本地端口进行接收,此端口也可以用bind和创建的socket绑定。但是bind必须是在通过这个socket发送数据前绑定,在发送数据后再bind会失败。下面给出代码:#define SEND_PORT 8000原创 2015-08-29 16:44:22 · 9329 阅读 · 0 评论 -
sizeof(数组名)及strlen(数组名)
程序的输出结果为: 1:100 2:4 3:1 //相当于a[100]这个数所占的字节大小,也就是一个char字节占得大小 当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)。 func(char* p){ strcpy(p, "1234");}int main(原创 2014-09-30 15:46:01 · 4357 阅读 · 0 评论 -
linux进程通信:使用posix消息队列mq进行线程或进程间的通信
POSIX消息队列允许进程以消息的形式交换数据。此API与System V消息队列(msgget(2),msgsnd(2),msgrcv(2)等)有明显不同,但做的事情差不多。 在linux多线程编程中,如果两个线程没用共同的数据区,则需要使用消息队列从一个线程往另一个线程发送消息(同样可以应用在进程间通信) 消息队列通过mq_open()创建和打开,此函数返回一个消息队列描述原创 2014-09-01 15:27:59 · 6023 阅读 · 0 评论 -
浮点数在内存中的表示方法及其字节序的转换
引用一篇博文http://blog.csdn.net/chenyujing1234/article/details/7683635此文章详细介绍了浮点数在内存中的表示 首先说一下浮点数的进制转换 10进制整形转换为2进制自然不必多说,对于浮点数转换为2进制,是将其整数部分和小数部分分别进行转换实现的 例如 123.45, 整数部分123,转换为原创 2013-10-10 18:13:00 · 2961 阅读 · 0 评论 -
实例验证网络字节序、主机字节序转换函数 htonl htons ntohl ntohs的用法以及需要注意的问题
htonl: 将long型主机字节序转换为网络字节序htons: 将short型主机字节序转换为网络字节序ntohl: 将long型网络字节序转换为主机字节序 ntohs: 将short型网络字节序转换为主机字节序 项目中遇到个问题,使用了htonl函数对short型网络字节序数进行转换,导致程序出错, 以为既然是很小的数字,那么short型和lon原创 2013-09-17 19:53:45 · 1937 阅读 · 0 评论 -
linux下简单的TCP服务端与客户端进行网络通讯的程序
服务器端:#include #include #include #include #include #include #include #include #define portnumber 3333#define MAX_CONNET_NUM 5int main(int argc, char* argv[]){ int sockfd; int原创 2013-09-13 17:30:31 · 2094 阅读 · 0 评论 -
地址转换函数htonl和inet_pton
uint32_t htonl(unin32_t host32bitvalue);参数是32bit的二进制数值,在转换地址时就是32位的主机字节序ip地址(经常用点分十进制)用法:servaddr.sin_addr.s_addr=htonl(127.0.0.1);servaddr.sin_addr.s_addr=htonl(INADDR_ANY); // INADDR_ANY真实值为0.转载 2013-09-10 17:21:29 · 2683 阅读 · 0 评论 -
string类型的格式化输出
在c语言中,对于char类型,我们有spirntf、snprintf进行格式化输出,但是string类型对格式化输出的支持不是很理想;例如对于功能sprintf(str, "bob's address is %s, and kevin's address is %s\n", add1, add2);可以定义一个stringstreamstd::stringstream fmt;f原创 2016-06-06 19:28:10 · 5249 阅读 · 0 评论