一些问题的整理
一 、 使用虚拟地址空间的好处是什么?
- 让每个进程拥有了相同的、独立内存空间,相互之间不会干扰
- 读写内存更安全。由于系统和MMU的限制,使得进程无法操作到其他进程的数据。
- 不连续的物理空间可以映射成连续的虚拟地址空间
- 进程分配的内存空间只有在实际使用时,才会触发缺页异常来分配实际物理空间,从而最大程度减少了内存空间的浪费。
【MMU:Memory Management Unit的缩写,中文名是内存管理单元,它是CPU中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。】
二、 如何设置一个文件重启后删除?
MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);·
WINBASEAPI
BOOL
WINAPI
MoveFileExA(
__in LPCSTR lpExistingFileName,
__in_opt LPCSTR lpNewFileName,
__in DWORD dwFlags
);
WINBASEAPI
BOOL
WINAPI
MoveFileExW(
__in LPCWSTR lpExistingFileName,
__in_opt LPCWSTR lpNewFileName,
__in DWORD dwFlags
);
#ifdef UNICODE
#define MoveFileEx MoveFileExW
#else
#define MoveFileEx MoveFileExA
#endif // !UNICODE
dwFlags的值 :
- MOVEFILE_REPLACE_EXISTING = 0x00000001; // 覆盖已存在的目标文件,如果来源文件和目标文件指定的是一个目录,则不能使用此标记。
- MOVEFILE_COPY_ALLOWED = 0x00000002; // 如果目标文件被移动到不同的卷上,则函数通过拷贝后删除来源文件的方法来模拟移动文件操作。
- MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004; // 在系统重新启动前,不执行移动操作,直到系统启动后,磁盘检测完毕后,创建页面文件之前,执行移动操作。因此,这个参数可以删除系统之前启用的页面文件。这个参数只能被拥有 管理员权限 或 LocalSystem权限 的程序使用。这个参数不能和 MOVEFILE_COPY_ALLOWED 一起使用。
- MOVEFILE_WRITE_THROUGH = 0x00000008; // 这个标记允许函数在执行完文件移动操作后才返回,否者不等文件移动完毕就直接返回。如果设置了 MOVEFILE_DELAY_UNTIL_REBOOT 标记,则 MOVEFILE_WRITE_THROUGH 标记将被忽略。
- MOVEFILE_CREATE_HARDLINK = 0x00000010; // 系统保留,以供将来使用
三、数据格式化输出
参数 | 对应类型 |
---|---|
%a | 浮点数、十六进制数字和p-计数法 |
%A | 浮点数、十六进制数字和p-计数法 |
%c | 一个字符(char) |
%C | 一个ISO宽字符 |
%d | 有符号的十进制整数(int) |
%md | m为指定的输出字段的宽度(如果数据的位数小于m,则左边补以空格,若大于m,按实际位数输出) |
%e | 浮点数、e-计数法 |
%E | 浮点数、E-计数法 |
%f | 单精度浮点数(默认float)、十进制计数法 |
%lf | 双精度数 |
%.nf | 这里n表示精确到小数点后n位的十进制计数 |
%g | 根据数值不同自动选择%f或%e |
%G | 根据数值不同自动选择%f或%e |
%i | 有符号的十进制数(与%d相同) |
%o | 无符号的八进制整数 |
%p | 指针 |
%s | 对应字符串(cahr*) |
%S | 对应宽字符串(WCHAR*) |
%u | 无符号十进制整数(unsigned int) |
%x | 十六进制整数 |
%X | 十六进制整数 |
%% | 打印一个% |
%I64d | 用于INT64或long long、unsigned long long |
四、LARGE_INTEGER转时间(文件时间转系统时间)
CString strEventTime = L"";
LARGE_INTEGER mLargeIntegerTime;
FILETIME fileTime;
fileTime.dwHighDateTime = mLargeIntegerTime.HighPart;
fileTime.dwLowDateTime = mLargeIntegerTime.LowPart;
SYSTEMTIME sysTime;
FileTimeToSystemTime(&fileTime, &sysTime);//将文件时间转换为标准系统时间
strEventTime.Format(_T("%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d"),
sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
时间&&时间差
//获取本地时间(转字符串)
time_t timeNow;
time(&timeNow);
tm tm1 = {0};
errno_t eResult = 0;
eResult = localtime_s(&tm1, &timeNow);
CString strTime = _T("");
if ( eResult == 0)
{
strTime.Format( _T("%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d"),
tm1.tm_year+1900, tm1.tm_mon+1, tm1.tm_mday,
tm1.tm_hour, tm1.tm_min,tm1.tm_sec);
}
//时间差
time_t time1,time2;
time(&time1);
time(&time2);
double dbTimeCount = difftime(time2, time1); //单位s
五、 CString 崩溃
1、 CString.MakeLower有概率崩溃,尽量改用CharLower
2、 CString FormatV
- std::string格式化输出,日志接口可变参数是(LPCTSTR lpszFormat, …)
std:string strData1 = "key"
//调用的时候strData1.c_str()直接输出会乱码==》CA2W(strData1.c_str(), CP_ACP);转一下再输出
//转完了不是乱码了,但是崩溃了。。。跟踪dump知道,崩溃位置出在FormatV,然后是转的这个参数
//虽然没搞懂最根本的原因是啥。。。但是,在CA2W的外面套了一层CString()就不崩了。。。
//so。。。这种格式化输出的位置,尽量用WCHAR*和CString吧。。。
六、 成员变量调用崩溃
- delete this之后,不要再使用任何它的成员,原因见:
https://blog.csdn.net/qq_43678418/article/details/87789974
七、 编译器对于未初始化的局部变量的处理
八、 运行时库
- C支持库包含从内存分配、错误处理、字符串处理、浮点计算、数据类型转换、文件和输入输出等方面的大量函数。
- C++标准库是为了方便使用C++语言编程而设计的一套函数、常量、类和对象库,包括标准输入输出、字符串、容器(列表、队列、map等)、排序和搜索算法、数学运算等。
- C++标准库由三大部分组成:C标准库、IO流、标准模板库(即STL)
九、 GitHub使用相关问题
https://blog.csdn.net/qq_36308972/article/details/103810559