![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C、C++
jjdujiang
这个作者很懒,什么都没留下…
展开
-
C++内存泄漏
非MFC程序内存泄漏程序初始化时添加_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);程序退出时添加_CrtDumpMemoryLeaks();源文件添加宏#ifdef _DEBUG #defind new new( _NORMAL_BLOCK, __FILE...原创 2019-04-24 21:27:01 · 181 阅读 · 0 评论 -
带 t 和 _s 的函数
atoi _ttoistrcpywcscpy _tcscpystrcpy_swcscpy_s_tcscpy_s带_s函数第二个参数是元素个数,不是字节数,要小于等于元素个数。第三个参数元素个数一定要小于等于第二个参数元素个数包括字符串结束符'\0'sprintf sprintf_ssprintf_s函数多了一个sizeof原创 2016-03-30 10:19:38 · 936 阅读 · 0 评论 -
宏的应用
#define DEF_AUTO_SG_M(TYPE, M) \public : \TYPE Get##M() \{ \ return m_##M; \} \void Set##M(const TYPE& m) \{ \ m_##M = m; \} \protected: \TYPE m_##M;#define DEF_AUTO_SG_M_PTR(TYPE,原创 2016-03-29 10:35:00 · 208 阅读 · 0 评论 -
正被停用的激活上下文不是最近激活的
今天工作时,遇到一个问题,程序在某个操作之后挂掉,但是堆栈显示不出来,只是提示正被停用的激活上下文不是最近激活的,经过研究发现,可能时哪个地方指针为空了,或者出现野指针了,需要设置异常才能看到哪个指针非法,VS2008菜单栏-调试-异常,全部选钩。原创 2016-05-25 16:40:59 · 758 阅读 · 0 评论 -
依赖名称不是类型
今天在写类模板时,编译遇到一个问题,依赖名称不是类型,在用到模板里的嵌套类型时,需要加上typename 这个是 template 的高级语法问题依赖受限名称不能作为类型看待,除非在它前面加一个关键字:typename原创 2016-05-25 15:57:01 · 2256 阅读 · 0 评论 -
WaitForMultipleObjects
如果因时间终了而返回,那返回值是WAIT_TIMEOUT 如果bWaitAll是TRUE,那么返回值是WAIT_OBJECT_0 如果bWaitAll是FALSE,那么返回值减去WAIT_OBJECT_0,就表示哪一个handle被激发了 如果函数失败,则返回WAIT_FAILD,这时候你可以用GetLastError()找出失败原因bWaitAll 为第三个参数原创 2016-05-24 10:23:53 · 410 阅读 · 0 评论 -
注意头文件路径
今天遇到一个bug,一个类修改了头文件,发现new和delete错误,经过调试,发现包含的头文件路径是另外一个同文件名的头文件,而我的头文件是从它拷贝过来的,另外一个头文件永远没有修改,所以要包含我的头文件,要注意!原创 2016-03-29 10:27:04 · 391 阅读 · 0 评论 -
unsigned 相减
今天遇到一个问题,经过调试发现两个unsigned相减要注意。例如unsigned long l1 = 1;unsigned long l2 = 2;if (l1 - l2 > 0)发现这个if语句永远成立,因为两个unsigned相减还是unsigned,所以永远成立以后要追忆这种情况。原创 2016-04-07 15:50:09 · 850 阅读 · 0 评论 -
父类和子类 同名成员变量和静态成员变量
父类和子类如果有相同名字的成员变量时,子类会使用自己的成员变量,如果想使用父类的必须通过指针或引用转换。class CBaseclass CA : public CBase拥有相同成员变量 int nCA a;a.n = 1;修改的是子类的成员变量,想要修改基类的成员变量((CBase*)&a)->n = 2;((CBase&)a).n = 2;对于指针原创 2016-03-25 15:14:11 · 1673 阅读 · 0 评论 -
类中的常量成员
类中的常量成员只能在初始化列表中赋值。原创 2016-05-21 10:47:29 · 613 阅读 · 0 评论 -
调用dll,误报内存泄露
可能是调用顺序造成的,在dll全局参数最后析构有可能产生,解决方法,退出应用程序之前主动析构。原创 2016-06-11 14:47:42 · 333 阅读 · 0 评论 -
setlocale
今天在用gdiplus画字符串时格式化字符串遇到一个问题,因为graphics.DrawString的字符串类型是wchar_t,所以需要格式化wchar_t,运用函数wsprintfW(wShengyu, L"剩余电量 %d%%", ucBatteryPercent);失败,经过上网找资料,缺少一句话setlocale(LC_ALL, "chs");设置本地的中文编码。原创 2016-06-13 15:51:10 · 394 阅读 · 0 评论 -
C#调用C++dll
调用规则_stdcall回调函数参数转换,C#中回调函数以委托的形式。C++数据类型 C#数据类型 void void int int char * 作为形参 System.string const char * 作为返回值 IntPtr IntPtr slotName = ""; System....原创 2019-04-24 21:25:07 · 264 阅读 · 0 评论 -
vs字体和颜色
https://studiostyl.es/原创 2017-06-20 16:37:08 · 1674 阅读 · 0 评论 -
WSASocket错误码10013
今天在笔记本上调试socket程序,发现WSASocket失败,错误码是10013,但是在台式机上可以的,经过上网查找好像是管理员权限的问题。项目右键-属性-链接器-清单文件-uac执行级别选择requireAdministrator,重新编译运行果然正确了,先记录下来。原创 2016-11-29 15:15:00 · 3073 阅读 · 0 评论 -
dbgview的使用
今天首次尝试使用dbgview调试,可以在release模式下,查看调试日志。TRACE统一改成OutputDebugString,使用过滤器,输入应用程序的pid就可以了。原创 2016-10-28 12:28:41 · 2048 阅读 · 0 评论 -
libusb的使用
m_idVendor = 0x4448; m_idProduct = 0x5916; m_pBus = NULL; m_pDevice = NULL; m_pDeviceHandle = NULL; // 初始化usb usb_init(); usb_find_busses(); usb_find_devices(); us原创 2016-06-17 15:14:59 · 486 阅读 · 0 评论 -
导出类的注意事项
在导出类的时候,基类也要导出来。原创 2016-06-17 10:01:49 · 375 阅读 · 0 评论 -
qt 波形图
今天研究了一下linxu和windows下利用QT跨平台开发GUI,为将来嵌入式图形界面的开发做准备,用到了开源波形库QCustomPlot,个人觉得比MFC上画的效果好多了,主要MFC还是用GDI画图,没有用GDI+画,所以没有渐变效果,附上效果图和主要源码// 设置纵坐标名称 ui->widgetPlot->yAxis->setLabel("应变应力(单位:με)");原创 2016-07-02 17:15:18 · 8919 阅读 · 2 评论 -
函数指针
在VC6中可以直接用函数名,但在VS2008当中,必须加&,不然会报错error C3867原创 2016-06-15 12:44:37 · 187 阅读 · 0 评论 -
函数和宏冲突
#include void f() { printf("function\n"); }#define f() printf("macro\n")int main() { f(); // macro (f)(); // function return 0;}函数名加上括号即可。原创 2016-03-24 10:46:49 · 458 阅读 · 0 评论 -
重载operator操作符
T& operator=(const T& t);static void operator new(std::size_t);static void operator delete(void*);想想重载new delete为什么是静态成员函数。原创 2016-04-05 10:20:39 · 274 阅读 · 0 评论 -
批处理
利用批处理清理VS垃圾文件@echo offecho 删除.ncb文件,保存类的信息的无编译浏览文件echo 删除.opt文件,保存工作空间的参数文件 echo 删除.aps文件,保存工程的资源信息文件echo 删除.clw文件,保存工程类向导信息文件echo 删除.plg文件,保存工程编译信息文件echo 删除.idb文件,保存需要重新编译的修改文件echo 删除原创 2016-03-30 08:34:03 · 237 阅读 · 0 评论 -
函数堆栈
EBP:栈底指针寄存器 ESP:栈顶指针寄存器EBP大,ESP小,压栈时ESP变小,EBP不变。原创 2016-03-18 15:34:30 · 192 阅读 · 0 评论 -
大端模式 小端模式
大端模式 低地址 高地址 高字节 低字节小端模式 低地址 高地址 低字节 高字节一般来说,在Win32上面是小端模式。原创 2016-03-18 16:04:39 · 212 阅读 · 0 评论 -
字符转换
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。 MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。常用的代码页由CP_ACP和CP_UTF8两个: 使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。 使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。所有个数都原创 2016-03-22 09:34:09 · 314 阅读 · 0 评论 -
结构体的初始化与赋值
结构体的初始化 typedef struct sTest { int a; int b; }STEST; STEST s1 = {0}; STEST s2 = {1, 2}; s1 = {1, 2}; // 错误,这种写法只能在初始化的时候使用原创 2016-03-30 13:51:22 · 3719 阅读 · 1 评论 -
静态成员变量
静态成员变量一定要初始化,不然编译不通过。原创 2016-03-30 12:47:02 · 289 阅读 · 0 评论 -
typedef
typedef std::vector TDEF_VECTOR_INT;原创 2016-03-30 12:31:12 · 277 阅读 · 0 评论 -
字符编码
strcpywcscpy _tcscpystrcpy_swcscpy_s_tcscpy_s带_s函数第二个参数是元素个数,不是字节数,要小于等于元素个数。第三个参数元素个数一定要小于等于第二个参数元素个数包括字符串结束符'\0'UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节原创 2016-03-22 09:25:19 · 208 阅读 · 0 评论 -
单例模式
单线程懒汉单例模式,静态指针,第一次调用的时候才会产生实例,没有考虑到多线程的安全性。多线程懒汉单例模式,静态指针,第一次调用的时候才会产生实例,并且加锁了,保证多线程的安全,但是每次调用的时候都会加锁,性能不够。以上两种方法都有同一个注意点,以时间换空间,需要手动析构。饿汉单例模式,静态全局变量,一开始就会生成实例,以空间换时间,不需要加锁,以指针的形式还是以对象的形式需要考虑,指针的话还要记原创 2016-03-18 13:41:01 · 232 阅读 · 0 评论 -
区别 #include
#include <iostream>#include <iostream.h>c++中新定义的函数都有名字空间的,用第一个需要加上 using namespace std,而第二个默认使用了名字空间。#include <iostream.h>等价于#include <iostream>;using namespace std;原创 2016-03-18 11:06:54 · 210 阅读 · 0 评论 -
内存对齐
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。 2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,原创 2016-03-17 09:46:28 · 254 阅读 · 0 评论 -
嵌套类 外围类
类似于一个名空间作用域,在外围类外部使用嵌套类时需要加上作用域。访问方式和普通类没有任何区别。原创 2016-04-01 12:58:00 · 314 阅读 · 0 评论 -
重写 strchr
char * strchr_ex(char * strDst, char c){ assert(strDst); if (!strDst) return NULL; while (*strDst != '\0' && *strDst != c) strDst++; return *strDst == c ? strDst : NULL;}char * strrchr_e原创 2016-03-19 15:44:39 · 355 阅读 · 0 评论 -
重写 strcpy
char * strcpy_ex(char * strDst, const char * strSrc){ assert(strDst && strSrc); if (!strDst || !strSrc) return strDst; char * p = strDst; while (*p++ = *strSrc++); return st原创 2016-03-19 15:19:48 · 325 阅读 · 0 评论 -
重写 strlen
unsigned int strlen_ex(const char * str){ // ☆☆☆☆☆ if (NULL == str) return 0; // 第一种方法 unsigned int nLength = 0; while (*str++ != '\0') nLength++; return nLength; //原创 2016-03-19 10:20:39 · 559 阅读 · 0 评论 -
重写 strcat
char * strcat_ex(char * strDst, const char * strSrc){ // ☆☆☆☆☆ assert(strDst && strSrc); if (NULL == strDst || NULL == strSrc) return strDst; char * p = strDst; while (*p++)原创 2016-03-19 14:36:18 · 536 阅读 · 0 评论 -
重写 strcmp
int strcmp_ex(const char * str1, const char * str2){ assert(str1 && str2); if (!str1 || !str2) return 0; while(*str1 == *str2) { if(*str1 == '\0') retur原创 2016-03-19 15:03:58 · 455 阅读 · 0 评论 -
内存分配
堆区,编译器自动分配释放,例如函数参数、局部变量。栈区,手动分配释放,malloc/free,new/delete。全局区、静态区,初始化的和未初始化的放在不同的地方。字符串常量区代码区char * p1 = "123456" 和 char p2[] = "123456" 的区别。char * p1 = "123456" 直接mov全局变量的值。mov dword ptr [ebp-10原创 2016-03-19 14:13:52 · 177 阅读 · 0 评论