C++
文章平均质量分 58
ucliaohh
丹景春醉容,明月问归期
展开
-
C/C++ Memory Layout
本文介绍了 C/C++ 中由源程序到可执行文件的步骤,和可执行程序的内存布局,数据存储类别,最后还通过一个例子来说明。可执行程序中的变量在内存中的布局可以总结为如下:变量(函数外):如果未初始化,则存放在 BSS 段;否则存放在 data 段变量(函数内):如果没有指定 static 修饰符,则存放在栈中;否则同上常量:存放在文本段.text函数参数:存放在栈或寄存器中内存可以分为以下几段:文本段:包含实际要执行的代码(机器指令)和常量。它通常是共享的,多个实例之间共享文本段。转载 2022-12-19 08:28:07 · 380 阅读 · 1 评论 -
C++ 编程规范
我们所使用的标准算法是由实现标准容器的那些人实现的,就凭他们对内幕的了解,所编写的算法的效率,就绝非你我编写的任何版本所能相提并论。但是最重要的还在于,许多算法的实现精巧绝伦,你我这样的一线程序员手工编写的代码也是不可能与之一较短长的。如果创建 “编译器防火墙” 将调用代码与类的私有部分完全隔离是明智的,就应该使用 Pimpl 惯用法:将私有部分隐藏在一个不透明的指针(即指向已经声明但是尚未定义的类的指针,最好是选择合适的智能指针)后面。函数对象的适配性好,而且与直觉相反,他们产生的代码一般比函数要快。转载 2022-12-19 08:23:33 · 849 阅读 · 0 评论 -
C++基础知识 const
/ 常量指针 (指向常量的指针)-- 指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化。// 指针常量 -- 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化。// 错误 因为这是一个常量指针 指针所指向的内容不能改变。// 错误 因为这是一个指针常量,指针所指向的地址不能改变。原创 2022-12-19 08:22:13 · 247 阅读 · 0 评论 -
C++ 基础知识 Char
/abcde 烫烫烫烫烫蘟 bcde 5。原创 2022-12-19 08:21:27 · 153 阅读 · 0 评论 -
BYTE,WORD,DWORD 的大小及一些特殊的 “高低位宏“
在 Visual C++ 6.0 中,char 型长度为 1 字节,short 型长度为 2 字节,int 和 long 型长度都为 4 字节,因此可以认为 BYTE 与 WORD,DWORD 定义的变量分别获得了 1 字节,2 字节,4 字节内存,正与 BYTE 与 WORD,DWORD 的字面意义相符。如:printf ("w 的高位字节:% x/n",HIBYTE (w));// 输出:w 的高位字节:ed。如:printf ("l 的高位字:% x/n",HIWORD (l));转载 2022-12-19 08:17:27 · 796 阅读 · 0 评论 -
配置读取 (C++)
/ 取最后的 "\" 号之前地址。// 获取可执行模块的路径。原创 2022-12-19 08:16:38 · 60 阅读 · 0 评论 -
三元一次方程组
{}{d3 * c1);}{a1 = 1;b1 = 2;c1 = 2;d1 = 4;a2 = 5;b2 = 6;c2 = 7;d2 = 8;a3 = 9;}原创 2022-12-18 10:56:15 · 520 阅读 · 0 评论 -
C++ 内存泄露和检测
在上面程序中,调用_CrtDumpMemoryLeaks () 来检测内存泄露,如果程序可能在多个地方终止,必须在多个地方调用这个函数,这样比较麻烦,可以在程序起始位置调用_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF),这样无论程序何时终止,都会在终止前调用_CrtDumpMemoryLeaks ()。2、“无主” 内存:申请内存后,指针指向内存的起始地址,若丢失或修改这个指针,那么申请的内存将丢失且没有释放。原创 2022-12-18 10:39:23 · 1832 阅读 · 0 评论 -
数组作函数参数传递和函数返回值
void fun(int a[] ) 或者 void fun (int a[长度]) 调用的时候就可以直接使用 fun(a)void fun(int a[][6] ) 调用的时候就可以直接使用 fun(a)。如果要将数组 a[][] 传递给函数 fun(),这个函数的定义中形参需要这样定义。如果要将数组 a[] 传递给函数 fun(),这个函数的定义中形参需要这样定义。例:用 typedef 定义一个新的类型。原创 2022-12-18 10:37:03 · 246 阅读 · 0 评论 -
C/C++ Memory Layout
本文介绍了 C/C++ 中由源程序到可执行文件的步骤,和可执行程序的内存布局,数据存储类别,最后还通过一个例子来说明。可执行程序中的变量在内存中的布局可以总结为如下:变量(函数外):如果未初始化,则存放在 BSS 段;否则存放在 data 段变量(函数内):如果没有指定 static 修饰符,则存放在栈中;否则同上常量:存放在文本段.text函数参数:存放在栈或寄存器中内存可以分为以下几段:文本段:包含实际要执行的代码(机器指令)和常量。它通常是共享的,多个实例之间共享文本段。转载 2022-12-18 10:21:51 · 138 阅读 · 0 评论 -
EASY_SIZE: 控件随窗口变化自由调整大小
(3).Options: 可以为 ES_HCENTER, ES_VCENTER 的结合,options 可置 0。3. 在对话框类定义的最前面添加 DECLARE_EASYSIZE (注意:没有分号)ES_HCENTER 表示缩放后控件在指定位置内水平居中;(1).control: 需要调整大小的控件的 ID;2. 添加 #include"easysize.h"BEGIN_EASYSIZE_MAP (对话框类名)控件 ID 值: 当前控件与指定控件之间的距离;ES_BORDER: 控件与对话框边界的距离;原创 2022-12-18 10:19:19 · 118 阅读 · 0 评论 -
CPPcheck 配置
CPPcheck 配置原创 2022-12-18 10:18:45 · 251 阅读 · 0 评论 -
C++ 指针 —02 指针与引用的对比
●“sizeof 引用” 得到的是所指向的变量 (对象) 的大小,而 “sizeof 指针” 得到的是指针本身的大小;指针可以被重新赋值指向不同的对象。引用不能被修改,但是指向的对象其内容可以修改。在使用引用之前不需要测试它的合法性,指针则总是被测试,防止其为空。指针指向一块内存,它的内容是所指内存的地址;●引用没有 const,指针有 const,const 的指针不可变;●引用是类型安全的,而指针不是 (引用比指针多了类型检查)●指针是一个实体,而引用仅是个别名;●引用不能为空,指针可以为空;原创 2022-12-17 12:52:15 · 58 阅读 · 0 评论 -
C++ 指针 —01 指针与数组的对比
同理,比较 b 和 a 的内容是否相同,不能用 if (b==a) 来判断,应该用标准库函数 strcmp 进行比较。要想复制 a 的内容,可以先用库函数 malloc 为 p 申请一块容量为 strlen (a)+1 个字符的 内存,再用 strcpy 进行字符串复制。a 的内容可以改变,如 a [0]= ‘X’。if (strcmp (b, a) == 0) // 不能用 if (b == a)if (strcmp (p, a) == 0) // 不要用 if (p == a)原创 2022-12-17 12:51:21 · 281 阅读 · 0 评论 -
C++\C# 数据类型问题 危险!!!
/////////////////////////// 封装方法 ////////////////////////////////////////int X = 0xfff43843;但是我们将 C++ 代码封装成 Dll,用 C# 程序去调用就不是上述那样了。1. 在 C++ 中。原创 2022-12-17 12:50:01 · 213 阅读 · 0 评论 -
关于虚函数
cout原创 2022-12-17 12:48:55 · 321 阅读 · 0 评论 -
关于纯虚函数
/ 错误: '->A::fun' : left operand has 'class' type, use '.’// 错误:left of '.fun' must have class/struct/union。// 错误:left of '.fun' must have class/struct/union。// 错误:C 并没有实现基类的纯虚函数,所以 C 仍是抽象类,不能建立对象。//3. 如果派生类只是简单地继承了抽象类的纯虚函数,而没有重新定义基类的纯虚函数,则派生类也是一个抽象类。原创 2022-12-17 12:48:24 · 500 阅读 · 0 评论 -
基础知识点--const
/ 常量指针 (指向常量的指针)-- 指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化。// 指针常量 -- 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化。// 错误 因为这是一个常量指针 指针所指向的内容不能改变。// 错误 因为这是一个指针常量,指针所指向的地址不能改变。原创 2022-12-17 12:47:50 · 138 阅读 · 0 评论 -
基础知识点--继承
/error:基类中私有成员在派生类中是不可见的,对对象不可见。//error:基类的保护成员在派生类中为保护成员,对对象不可见。//error:基类中私有成员在派生类中是不可见的,对对象不可见。//error:基类的保护成员在派生类中为私有成员,对对象不可见。//error:基类中私有成员在派生类中是不可见的,对对象不可见。//error:基类的保护成员在派生类中为保护成员,对对象不可见。//error:基类的公共成员在派生类中为保护成员,对对象不可见。//ok:基类的保护成员在派生类中为保护成员。原创 2022-12-17 12:47:21 · 490 阅读 · 0 评论 -
共享内存(C++)
{);if (!hMapFile)return;);if (!pView){}HKEY hKEY;if (ret0!return;if (ret1!return;{);if (!hMapFile));if (!pView){}{{}}}原创 2022-12-16 08:23:59 · 226 阅读 · 0 评论 -
VC++ 六种 Runtime Library
该选项生成的可执行文件运行时不需要运行时库 dll 的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。在你的 VS 安装目录下 (如 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64\Microsoft.VC100.CRT),及系统目录 C:\Windows\System32、C: \Windows\SysWOW64 下都能找到对应的.dll 库。(3). 动态链接的运行时库。原创 2022-12-16 08:22:01 · 1426 阅读 · 0 评论 -
C++ 内存管理 —01
无论是堆还是栈,都要防止越界现象的发生(除非是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生意想不到的结果,就算是在程序的运行过程中,没有发生上面的问题,也还是要小心,说不定什么时候就崩掉,那时候 debug 是相当困难的。对于栈来讲,则不会存在 这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考。对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。原创 2022-12-16 08:20:58 · 53 阅读 · 0 评论 -
运算符重载
{public:{}};{}int main(){}原创 2022-12-16 08:19:35 · 211 阅读 · 0 评论 -
设置 VS 以管理员身份运行
等待弹框出现后,选择 “疑难解答程序”---- 然后选择该程序需要附加权限 ---- 点击下一步 ------ 在点击测试程序(不点击不让下一步)然后再下一步 ----- 然后选择是保存设置就行 了。找到 devenv.exe 文件 右键找到 兼容性疑难解答。到这里打开程序或者直接启动 vs 都是以管理员身份启动的了。vs 右键属性 -----或者点击下面的打开文件位置。以 vs2013 为例。原创 2022-12-16 08:18:03 · 1435 阅读 · 0 评论 -
解决VS报no symbols loaded的错误
但是都没有解决我的问题。最后还是老大帮我搞定了。他也觉得很奇怪,因为我这台机器的问题是在Select code type的时候,选择自动识别,但是VS识别错了。改为了Native Code之后就好了~ 我是这么猜想的,因为我的目标project还依赖于其他项目,其他项目之中有C++的也有C#的,可能就这样,VS自动选择了T-SQL & Managed Code 而我的项目是C++的,所以改为了。之后就好了~ 反正网上是没见过这种解决方法的~ 给大家提供个思路吧~转载 2022-12-16 08:16:23 · 698 阅读 · 0 评论 -
[MFC] FTP 遍历服务器目录文件卡住的问题
刚开始还打算用 DOS 中的 FTP 命令来做 FTP 客户端来着,后来才发现 MFC 已经有封装了 FTP 操作类,貌似还支持断点续传,相关的文章倒是不少,但是居然出现如下问题,不过让我通过搜索加瞎扯给猜出来了 :)开始还以为是服务器的问题,后来发觉不是这么回,通过搜索 + 瞎扯给弄出来了,后来朋友给帮忙找了一篇文章,即文章一,解释了该问题。关键是最后一个参数,参照定义可知默认为 FALSE,以上方法为 CInternetSession 类的,关于 MFC 的 FTP 这里就不介绍了,文章很多。转载 2022-12-16 08:14:49 · 402 阅读 · 0 评论 -
LIB 和 DLL 的区别与使用
(2).LIB 文件,是 dll 在编译、链接成功之后生成的文件,作用是当其他应用程序调用 dll 时,需要将该文件引入应用程序,否则产生错误。使用动态链接中的 lib,不是 obj 文件的集合,即里面不会有实际的实现,它只是提供动态链接到 DLL 所需要的信息,这种 lib 可以在编译一个 DLL 工程时由编译器生成。(3).dll 文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe 文件和.dll 文件,并不需要.lib 文件和.h 头文件。如果要完成源代码的编译,只需要 lib;转载 2022-12-15 09:12:03 · 2993 阅读 · 1 评论 -
VC 调试无法进入断点解决方法
警告有两个,一个是文件的,不带行号,另一个带行号。然后开始逐步逼近问题,把注释前后汉字逐个拿掉,直到问题消失,最后剩下来的核心词是 “即时消息”,搜索这个词,果然在整个项目里只有一个。修一个 Bug,提交,然后更新了一下,编译,运行,发现我也染上这个症状了 —— 只有那个文件无法插入断点。1. 解决方案配置是 Debug ,但没有在工程属性页中 “Alt+F7”->“配置属性”->“C/C++”->“常规”->“调试信息格式”,选择 “用于 “编辑并继续” 的程序数据库 (/ZI)”。呵呵,应该就是它了。转载 2022-12-15 09:11:12 · 1241 阅读 · 0 评论 -
数组作函数参数传递和函数返回值
void fun(int a[] ) 或者 void fun (int a[长度]) 调用的时候就可以直接使用 fun(a)void fun(int a[][6] ) 调用的时候就可以直接使用 fun(a)。如果要将数组 a[][] 传递给函数 fun(),这个函数的定义中形参需要这样定义。如果要将数组 a[] 传递给函数 fun(),这个函数的定义中形参需要这样定义。例:用 typedef 定义一个新的类型。转载 2022-12-15 09:09:57 · 400 阅读 · 1 评论 -
MessageBox、::MessageBox 、AfxMessageBox 三者的区别
2)CWnd::MessageBox () 是 CWnd 的成员函数,它要求 MessageBox 只能在 cwnd 类及其子类中使用;1)在非 CWnd 类中使用则是 API MessageBox 函数,但它使用起来非常不便,必须指定标题、句柄和样式等,否则选用 CWnd::MessageBox () 或 AfxMessageBox,它们使用起来方便。2)MessageBox 是模态对话框,你不进行确认时程序不往下运行,它会阻塞你当前的线程为,除非你程序是多线程的程序,否则只有等待模态对话框被确认。转载 2022-12-15 09:09:17 · 304 阅读 · 1 评论 -
C++ delete 错误
我们原意是要释放 p 最初通过 new int[100] 而得到的内存空间,但事实上,p 那时已经指向 girl[100] 了。由于 pbak 正是指向 p 最初分配后的地址,我们删除 pbak, 就是删除 p 最初的指向。这也就引出 new / delete 及 new[] / delete[] 在本章的最后一个问题。如下所示:在 delete [] p 时,p 指向的是第二个元素,结果该释放将产生错位:第一个元素没有被释放,而在最后多删除了一个元素。//p 的指向改变了,指向了下一元素。转载 2022-12-15 09:08:16 · 1413 阅读 · 1 评论 -
main 函数执行前、后再执行的代码
在 exit 所执行的任何标准清理操作之前,被注册的函数按照与注册顺序相反的顺序被依次调用。main () 同样也是一个函数,在结束时,按出栈的顺序调用四个函数,即为 fn4 () -> fn3 () -> fn2 () -> fn1 ();(2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行 main 函数之前,而 main 函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作。注册这个函数的目的就是为了在函数退出时调用的,即使是 main () 函数也是这样的。转载 2022-12-15 09:07:01 · 817 阅读 · 0 评论 -
引用作为函数返回值
如果函数的参数实质就是形参,不过这个形参的作用域只是在函数体内部,也就是说实参和形参是两个不同的东西,要想形参代替实参,肯定有一个值的传递。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由 new 分配)就无法释放,造成 memory leak。关于第二点,可以结合第一点分析,p1 和 p2 是实参的引用,不用经过值的传递机制,已经有了实参值的信息。float fn1 (float r) // 定义函数 fn1,它以返回值的方法返回函数值。转载 2022-12-15 09:06:44 · 2085 阅读 · 1 评论 -
最短路径算法
*-------------------------------------- 主函数 ---------------------------------------*//*-------------------------------------- 函数菜单操作 ------------------------------*//*--------------------------------- 有向图 函数操作 --------------------------*/转载 2022-12-15 09:04:50 · 73 阅读 · 0 评论 -
C++ 动态二维数组
/int *p = new int (3) 分配一个 int 类型大小的区域 并将 3 存入其中。// 这里将 pRecord 作为一个指向指针的指针,它指向一个包含 5 个元素的指针数组,并且每个元素指向一个有 3 个元素的数组,这样就构建了一个 5 行 3 列的数组。//delete pRecord 只释放了 pRecord 指向数组的第一个元素。//int*[5] 表示一个有 5 个元素的指针数组。// 释放单个 int 的空间。原创 2022-12-15 09:02:53 · 684 阅读 · 0 评论 -
C++ 的强制类型转换
・static_cast 可以被用于强制隐型转换(例如,non-const 对象转型为 const 对象,int 转型为 double,等等),它还可以用于很多这样的转换的反向转换(例如,void* 指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个 const 对象转型为 non-const 对象(只有 const_cast 能做到),它最接近于 C-style 的转换。如果情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任何的实现都不是方便的。(即使它是不允许隐式的)转载 2022-12-14 08:21:37 · 178 阅读 · 0 评论 -
单链表学习二
{}};{i++){}}{i++){}}{= NULL){}}{= NULL){}}{{}else{}}{= pHead){}}int main(){i++)i++)原创 2022-12-14 08:20:48 · 51 阅读 · 0 评论 -
MFC 单文档去掉默认的菜单、工具栏和状态栏
在 BOOL CMainFrame::PreCreateWindow (CREATESTRUCT& cs) 中,修改结构变量 cs.style。在 BOOL CMainFrame::PreCreateWindow (CREATESTRUCT& cs) 中,修改结构变量 cs.style。在 BOOL CMainFrame::PreCreateWindow (CREATESTRUCT& cs) 中,增加语句。取消某一样式:cs.style &|=~ WS_MINIMIZEBOX;// 即 菜单句柄赋值为空。原创 2022-12-14 08:18:00 · 719 阅读 · 0 评论 -
堆 & 栈
栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是 C/C++ 函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构 / 操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。堆都是动态分配的,没有静态分配的堆。原创 2022-12-14 08:17:18 · 43 阅读 · 0 评论 -
多线程之信号量(By C++)
多线程之信号量(By C++)转载 2022-12-14 08:15:10 · 175 阅读 · 0 评论