![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
叶之香
闲看繁花似锦
展开
-
VC编程技巧
[1]//防止程序的多个实例同时运行HANDLE hMutex=CreateMutex(NULL,FALSE,"IADSOnlyOnce");/命名Mutex是全局对象 在所有的process都可以访问到 if(ERROR_ALREADY_EXISTS==::GetLastError()){ AfxMessageBox("该程序已经在运行中..."); ExitProcess转载 2009-05-29 12:45:00 · 603 阅读 · 0 评论 -
VC屏蔽Enter和ESC退出程序
重载PreTranslateMessage函数屏蔽回车和ESC的消息:BOOL C***Dlg::PreTranslateMessage(MSG* pMsg) { if(WM_KEYDOWN == pMsg->message ) { UINT nKey = (int) pMsg->wParam; if( VK_RETURN == nKey || VK_ESCAPE == n原创 2009-05-29 12:44:00 · 1631 阅读 · 0 评论 -
Linux segfault错误排查
Linux下一般情况程序出现段错误异常崩溃时,并不会产生core文件,此时可借助/var/log/messages中打印的错误信息进行排查。如下错误信息:segfault at 7f30beffe000 ip 00007f30c6eebda9 sp 00007f30a7ffc4a0 error 4 in libc-2.17.so[7f30c6e56000+1c3000]其中,异常在libc-2.17.so库中,00007f30beffe000为出错地址,7f30c6eebda9为指令地址,00007原创 2021-04-12 15:38:37 · 7706 阅读 · 6 评论 -
Linux sem_trywait实现sem_timedwait
sem_timedwait说明 int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); 其中第2个参数struct timespec *abs_timeout要求为绝对时间,如果手动将系统时间往后修改会导致sem_timedwait长时间阻塞sem_trywait说明 int sem_trywait(sem_t *sem); sem_trywai...原创 2021-04-12 16:48:10 · 1945 阅读 · 0 评论 -
C/C++ Openssl API RSA加解密文件
生成私钥openssl genrsa -out prikey.pem 1024生成公钥openssl rsa -pubout -in prikey.pem-out pubkey.pem#include <stdio.h>#include <openssl/rsa.h>#include <openssl/pem.h>#include <openssl/err.h> const char *publicKey = "-----BEGIN P...原创 2021-04-12 16:14:25 · 424 阅读 · 0 评论 -
GDB打印同名全局变量名不准确
有如下程序逻辑结构,主程序中调用两个动态库,动态库中,含有相同名字的全局变量,在后加载库的函数中,更改全局变量值,使用GDB查看时,值未更改。主程序代码如下:#include <stdio.h>#ifdef _WIN32#include <Windows.h>#else#include <dlfcn.h>#include <unistd...原创 2020-03-11 10:26:09 · 530 阅读 · 0 评论 -
GDB打印变量值不正确
最近在工作中遇到使用GDB查看调试版程序变量值不正确的问题,但是使用printf输出变量值是正确的,现象如下图:源码如下:#include <stdio.h>void func(int *p){ printf("p=%p\n", p); p = (int *)0x101; printf("p=%p\n", p);}...原创 2020-03-11 09:40:07 · 1096 阅读 · 0 评论 -
C++类初始化列表与构造函数内赋值区别
最近面试过程中,面试问了类构造初始化列表和构造函数内赋值有什么区别。当时没完全回答清楚,后来google了一下,发现两者有如此大的不同,现总结如下。构造初始化列表中,是直接调用相应的构造函数进行对象初始化操作。而在构造函数内赋值会,先经过调用无参构造函数进行初始化,然后再调用相应的赋值函数,进行赋值操作。可见前者的执行效率更高。请对比以下两组代码的执行结果:#include int g_c原创 2016-07-07 17:23:00 · 592 阅读 · 0 评论 -
C/C++面试题集锦
如下代码:#include int g_int = 1;class A{public: int getInt0(void) { return g_int; } int getInt1(void) { return m_int; } virtual int getInt2(void) { return g_int; }private: int m_in原创 2016-07-08 17:21:59 · 290 阅读 · 0 评论 -
查看C++类内存布局----Visual studio
使用Visual studio的两个命令参数即可查看:/d1 reportAllClassLayout 或者 reportSingleClassLayoutXXX,其中XXX代表类名。如图对项目配置然后编译运行,即可在运行生成框里显示原创 2016-07-08 17:27:50 · 961 阅读 · 0 评论 -
关于CreateThread和_beginthreadex的区别与联系
1.简单来说CreateThread是Windows下用于创建线程的系统API,_beginthreadex则是Visual C++运行时库函数2._beginthreadex会在内存堆上分配一个与线程相关的数据块,而CreateThread不会分配该数据块3.如果调用strtok、strerror、gmtime等等,会分配线程相关的数据块。当线程退出时,用_beginthreadex创建原创 2013-04-27 18:33:38 · 781 阅读 · 0 评论 -
kmp字符串匹配C实现
kmp字符串匹配的算法C/C++实现原创 2016-09-29 01:29:24 · 429 阅读 · 1 评论 -
opencv自动扣图代码实现
#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <process.h>#include <windows.h>using namespace std;using namespace cv...原创 2018-08-01 00:22:32 · 2256 阅读 · 0 评论 -
解决网络延迟200ms问题
最近在项目中引入了HPSocket网络框架,但是在测试过程中发现网络始终延迟200ms,最终查找到问题原因是未启用Socket的TCP_NODELAY。在以下地址也有相关的讨论:https://serverfault.com/questions/834326/questions-about-nagle-vs-delayed-ackTCP/IP协议中,无论发送多少数据,总是要在数据前面加上协...原创 2018-09-05 17:33:34 · 11288 阅读 · 0 评论 -
根据输入字符串,输出所有字符能组成的串(面试题)
比如输入"abc",得到abc, acb, bac, bca, cab, cba。代码如下: #include <stdio.h>#include <vector>using namespace std;void func(vector<char> &chList, vector<char> &travelList...原创 2018-09-06 14:38:22 · 579 阅读 · 0 评论 -
C/C++注册CTRL+C退出程序
#include <signal.h>static bool g_bStop = false;void inner_signal_handler(int signum){ g_bStop = true;}static void InnerRegisterSigaction(){ struct sigaction act; act.sa_handl...原创 2019-04-01 10:33:10 · 1738 阅读 · 0 评论 -
C++类构造函数,拷贝构造函数,赋值函数,析构函数几点注意
一个空类时,编译器会默认生成构造函数,拷贝构造函数,赋值函数,析构函数一个类如果重写拷贝构造函数,那么必须自定义一个构造函数。如下代码会编译出错:error C2512: “B”: 没有合适的默认构造函数可用class B{public: B(const B &b) { }};int main(void){ B b; getchar();原创 2016-07-07 16:27:17 · 2868 阅读 · 0 评论 -
std::sort的比较函数严格弱序(strict weak ordering)
在调用std::sort函数时,在调试版本的程序下,抛出异常“Expression: invalid operator 谷歌发现是跟严格弱序相关,虽然不是十分懂,不过微软提供了相关解决方法,如下解决方法:https://support.microsoft.com/zh-cn/kb/949171原创 2016-06-13 17:57:49 · 1676 阅读 · 0 评论 -
结构体对齐的具体含义(#pragma pack)
作者:panic2005年4月2日还是来自csdn的帖子:主 题: 探讨:内存对齐作 者: typedef_chen ((名未定)(我要骗人))等 级: 信 誉 值: 100所属论坛: C/C++ C++ 语言问题点数: 50回复次数: 1发表时间: 2005-04-02 22:53:27 朋友帖了如下一段代码: #pragma pack(4)转载 2009-03-22 16:48:00 · 383 阅读 · 0 评论 -
讲讲volatile的作用
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic var转载 2009-03-30 10:29:00 · 572 阅读 · 0 评论 -
atexit函数
很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。 atexit()函数的参数是一个函转载 2009-04-14 08:22:00 · 461 阅读 · 0 评论 -
C/C++转义字符
转义字符是C语言中表示字符的一种特殊形式。通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号( ),用于表示字符串常量的双撇号( ")和反斜杠( /)等。转义字符用反斜杠/后面跟一个字符或一个八进制或十六进制数表示。 转义字符 意义 ASCII码值(十进制) /a 响铃(BEL) 007 /b 退格(BS) 008 /f 换页(FF) 012原创 2009-05-04 14:19:00 · 1062 阅读 · 0 评论 -
Unicode到UTF-8的转换详解
Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。 UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP(Basic Multilingual Plane)字符最多只用到3字节长。下面看一原创 2012-08-04 11:14:28 · 1045 阅读 · 0 评论 -
由setlocale解决中文显示引发的探索
1.关于MD(d)、MT(d)编译选项的区别编译选项包含静态链接的lib说明/MD_MT、_DLLMSVCRT.lib多线程、Release、DLL版本的运行时库/MDd_DEBUG、_MT、_DLLMSVCRTD.lib多线程原创 2013-04-27 16:58:11 · 3711 阅读 · 0 评论 -
linux下运行时更改进程名
以前代码在linux下可以达到更改进程名,windows上不能实现此功能。#include #include int main(int argc, char **argv){ char buff[100]; memset(buff,0,sizeof(buff)); strncpy(buff, argv[0], sizeof(buff)); mem原创 2013-05-10 11:52:10 · 1162 阅读 · 0 评论 -
一道面试题分析
#include int main(void) { int a = 10, b = 20, c = 30; printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2)); return 0; } 上面的输出是:110..40..60 分析:因为函数压栈的原因,函数在参数压栈的时候,是从右至左的原创 2013-05-10 14:03:47 · 524 阅读 · 0 评论 -
实现程序唯一实例运行
有时候在写一些程序的时候,例如服务,我们需要限制程序唯一实例。实现程序唯一实现的方法有多种,例如创建一个独占文件,包括socket端口等等。这里介绍个人觉得比较好的方式。分别是Windows和linux下的方法。1.Windows上面创建内核命名事件或者命名互斥对象。如果调用CreateEvent和CreateMutex后,GetLastError()返回ERROR_ALREADY_E原创 2013-05-14 17:44:30 · 852 阅读 · 0 评论 -
_ConnectionPtr.CreateInstance(__uuidof(Connection)) 返回 E_NOINTERFACE
依据microsoft的说明(http://support.microsoft.com/kb/2517589),解决方法是将#import "msado15.dll" no_namespace rename("EOF","EndOfFile")改为#import "msado60_Backcompat.tlb" no_namespace rename("EOF","EndOfFile"原创 2013-05-15 17:52:26 · 1960 阅读 · 0 评论 -
ping功能的实现原理
1.Windows下ping实现Windows平台实现ping功能,需要涉及到两个动态库Icmp.dll和Iphlpapi.dll。根据msdn的说明:“The IcmpParseReplies function is exported from the Icmp.dll on Windows 2000. The IcmpParseReplies fun原创 2013-06-04 12:19:27 · 3376 阅读 · 0 评论 -
监控Windows操作系统用户增删修改
监控Windows操作系统的用户信息更改,可以采用监控注册表来实现。在注册表中,用户和用户组信息保存在HKEY_LOCAL_MACHINE的SAM\\SAM\\Domains\\Account下面。用户信息保存在SAM\\SAM\\Domains\\Account\\Users下面;用户组信息保存在SAM\\SAM\\Domains\\Account\\Aliases下面。当然可以采用写注原创 2013-07-11 11:24:24 · 1705 阅读 · 0 评论 -
RHEL下,网络断开时不能及时监测socket断开的解决方法
最近在RHEL5下面,遇到了将网络拔掉,socket的send函数在发送小包数据的时候,依然能够成功;而在发送大包的时候,却需要很久才会超时退出阻塞状态。首先这里有两个问题:1.send小包数据时,一定会成功,无法判断网络连接正常2.send大包数据时,会阻塞很久,才会退出解决问题1,需要自己做心跳机制,比较好解决。解决问题2,需要用到setsockopt函数来设置发送超时值#原创 2013-12-26 14:15:51 · 847 阅读 · 0 评论 -
C/C++编程操作IIS7
由于IIS6与IIS7以后的编程接口更改,导致IIS6的项目无法访问IIS7,研究了几天时间,终于有些眉目,现在记录如下。首先需要说明如下问题:1.iis7以后的版本不再支持nntp (http://forums.iis.net/t/1160175.aspx这个页面有明显说明)2.如果要使用smtp需要系统安装iis6兼容组件3.如果要使用iis6的接口来访问iis7的信息需要安装原创 2014-01-10 10:17:22 · 3274 阅读 · 1 评论 -
pragma预处理指令详解
本文转载自:http://www.cppblog.com/xczhang/archive/2007/12/24/39477.html在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示转载 2009-03-22 17:43:00 · 472 阅读 · 0 评论