小心临时字符串std::string
前言
实际开发时发现有个地方函数执行的比较奇怪,例如:
int main()
{
const char* str1 = std::string("A").c_str();
for(int i = 0 ;i < 100; ++i)
{
const char* str2 = std::string("B").c_str();
// do something
// str1 指向的值会变为 "B"
}
}
原因
发生这个问题的原因是表达式中的std::string("A")在当前行执行结束时就已经释放了。
变量str1虽然看起来有值,但实际上是指向了已经被释放的内存。
所以当再次...
Azure DevOps 生成管道每次运行都会清理并重新获取所有代码
表现
Azure DevOps在生成管道时,总是清理掉旧的代码并重新获取。
原因
这个问题已知的一种原因是由于Bug引起的。
当获取的源代码中,同时获取了目标目录和目标目录/子目录就会导致这个问题。
解决方法
解决方法十分简单:依据自己要获取的内容,重新梳理代码映射设置,避免嵌套即可。
在 Windows 和 tcmalloc 愉快的玩耍吧
起始
都说使用tcmalloc可以有效的提高 new 和 delete的效率,所以我要尝试一下~~
了解前因后果,按顺序看。
简单有效直接看 gperftools项目编译tcmalloc。
tcmalloc 的编译
获取tcmalloc代码
首先,我们找到tcmalloc的代码库,然后获取代码~~
https://github.com/google/tcmalloc.git
尝试编译
看文档中的说明并未提到Windows怎么编译,估计会出意外。
按照说明,需要使用Basel编译,这是官网,这是bazel-7.1.2-windows-x86_64的下载连接。
安装后按照说明编译吧~~
大概率不出意外的会出意外。。。
如果跟我一样出问题了看后面,没出问题应该就能得到li...
TeamFoundation 销毁或永久删除文件
命令
使用tf destroy命令销毁或永久删除 Team Foundation 版本控制 (TFVC) 中的版本控制的文件。
tf destroy [/keephistory] <itemspec1>[;<versionspec>][<itemspec2>...<itemspecN>] [/stopat:<versionspec>] [/preview] [/startcleanup] [/noprompt] [/silent] [/login:username,[password]] [/collection:TeamProjectCollectionUrl]
示例
tf destroy $/Thirdparty/...
ShellExecute和ShellExecute存在内存泄漏
症状
某程序执行一段时间后,内存被大量占用,且任务管理器中查看所有程序使用内存总和与内存实际占用量不符。
问题
经验证,当程序内调用ShellExecute和ShellExecuteEx时,会由系统在程序外部分配内存,并与程序关联,且仅在程序退出时释放。
如果频繁调用,将占用大量外部内存。
由于这些内存是程序外分配的,所以内存泄漏工具无法检测、任务管理器中也无法看到内存占用。
解决方法
减少使用次数。
请勿忽略 warning C4819
原因
waring C4819是一个常见的C++编译警告,是因为文件中的包含了当前代码页无法表示的字符。实际示例如下所示:
2>F:\libigl-2.5.0\include\igl\parallel_for.h(1,1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
请勿忽略
该警告在极少数情况下会导致以下甚至更多奇怪的错误:
error C2065: “xxx”: 未声明的标识符
error C2923: “xxx”: “xxx” 不是参数 “xxx” 的有效 模板 类型参数
error C2244: “xxx”: 无法将函数定义与现有的声明匹配
error ...
_USRDLL _AFXDLL _WINDLL 三种dll编译宏的具体含义
转载自 _USRDLL _AFXDLL _WINDLL 三种dll编译宏的具体含义
#
常见的编译参数VC建立项目时总会定义Win32。控制台程序会定义_CONSOLE,否则会定义_WINDOWS。
Debug版定义_DEBUG,Release版定义NDEBUG.
与MFC DLL有关的编译常数包括:
_WINDLL 表示要做一个用到MFC的DLL
_USRDLL 表示做一个用户DLL(相对MFC扩展DLL而言,静态)
_AFXDLL 表示使用MFC动态链接库的 regular DLL(动态)
_AFXEXT 表示要做一个MFC扩展DLL
所以:
Regular, statically linked to MFC
_WINDLL,_USRDLL
Regular, using ...
QT 和 MFC 兼容问题
起因
在QT环境下,因为MFC环境未进行默认初始化,所以会导致MFC对话框会因为资源切换问题导致无法正确初始化。
问题原因及思路
整个环境中,至少保证一个DLL中使用从CWinApp派生自定义实力的方式实现DLL。
派生类实现
派生方法如下:
class __declspec(dllexport) Z_MyApp : public CWinApp
{
public:
Z_UserInterfaceApp();
public:
virtual BOOL InitInstance();
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(Z_MyApp, CWinApp)
END_MESSAGE_MAP()
...
共计 33 篇文章,5 页。