C, C++, Obj-C

关于stl vector调用erase后的Vector iterators incompatible!

出错代码如下(VS2010),使用vector迭代器遍历并对满足条件的元素进行删除,

	vector::iterator it=m_vecDataUnits.begin();
	for (;it!=m_vecDataUnits.end();)
	{
		if (it->m_bSelected)
		{
			m_vecDataUnits.erase(it);
		}
		else
			it++;
	}

正确方法如下,删除vector元素后的it应该使用erase返回的值

	vector::iterator it=m_vecDataUnits.begin();
	for (;it!=m_vecDataUnits.end();)
	{
		if (it->m_bSelected)
		{
			it = m_vecDataUnits.erase(it);
		}
		else
			it++;
	}

Visual Studio下的C++程序断点windows api调试的方法

就当是个记录吧,收藏夹多了也不好找。
以前抄过一个利用dbghelp api来进行release版调试跟踪的工具类,就是当release版exe在客户机上异常后记录堆栈,局部变量,寄存器值等的东西。突然发现一个小问题需要断点调试检查,但发现这个在挂着调试器的时候就不起作用了,google发现这篇文章:
http://www.debuginfo.com/articles/debugfilters.html
大概意思看明白了,结果文中提到的下windows api断点的部分不知道怎么做,继续google发现MSDN上有大致说明:
http://msdn.microsoft.com/en-us/library/d16ayc6z.aspx
手动添加断点的location要这样:{,,USER32.DLL}_MessageBeep@4,用起来还是比较麻烦的,因为还要涉及到api的dll中导出decorated name,不过至少是能用了,知足常乐。
PS:注意这个提到的是32bit系统下,而且调试时需要导入这些加在的系统dll的调试符号,好在发现VS2010有个Load symbols from microsoft symbol servers,虽然下载慢了点不过还是挺方便的。

支持C++标准库的Android NDK CrystaX!

最近在研究Box2D物理引擎在Android上的应用时,发现直接用NDK移植C++版本时遇到了一些STL库的问题,类似b2BroadPhase.h中的:
// Sort the pair buffer to expose duplicates.
std::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan);
这里,其它地方通过直接替换标准c函数还好解决,这种需要STL库的用法就不好办了。在Box2D的论坛上发现有人提到有个叫CrystaX的第三方版本的NDK,整合了C++标准库,可以直接在不修改任何源码的情况下编译Box2D!
下载地址:http://www.crystax.net/android/ndk.php

[ZT]简单内存泄漏检测方法,解决Detected memory leaks!问题

原文地址:http://hi.baidu.com/v71000/blog/item/414437de599dfed58c102929.html

工作环境:WIN7,VS2005:

最近一个项目中,程序退出后,每次都出现内存泄漏,每次退出的时候泄露的内存块都是1654,1650。

Detected memory leaks!
Dumping objects ->
{1654} normal block at 0x01CC1B28, 40 bytes long.
Data: 54 00 69 00 63 00 6B 00 65 00 74 00 20 00 69 00
{1650} normal block at 0x01CC1BF0, 16 bytes long.
Data: 64 6B E8 95 68 79 0D 4E FD 80 7F 4F 28 75 00 00
Object dump complete.

解决方法

1、在程序开始的地方,加上代码:_CrtSetBreakAlloc(1654); //1654为上面内存泄漏的块号。

2、用Debug模式运行,程序自动断点在“内存块1654”分配的位置。

3、这个时候一直利用“调试”-“退出”,或快捷键“SHIFT+F11”跳转,直到看到了自己的代码。

4、检查自己在该代码中分配的内存块,是否进行了合理的释放。

MFC控件CListBox调整大小时的高度注意事项

CListBox控件在进行调整大小时,默认是按照控件内item的高度进行高度变化递增的,也就是说,高度会是单个项高度的倍数,以便完整显示可见项。这样在父窗口OnSize时调整控件大小会出现高度和计算出的填充全客户区大小高度不一致的问题,显示上会有部分区域重绘错误。改变这种默认高度行为的方法就是在创建控件时,加上LBS_NOINTEGRALHEIGHT这个style bit。

用BCG Control Bar库的MFC程序中文字体过小问题的解决方法

这个问题和上一个转帖的VS2010 MFC文字过小问题如出一辙,但是那篇帖子里的解决方法只是一个临时的解决方法,对于应用BCG库后的MFC程序,尤其是应用了部分主题以后,即使修改了字体,也会由于UI部分很多地方会调用BCGPGLOBAL_DATA的UpdateFonts导致修改后的font被默认字体覆盖。
其实用源码跟踪了一下后发现,导致中文字体难看的原因其实是Segoe UI这个字体,于是修改了Bcgglobals.cpp中
static const CString strOffice2007FontName = _T(“Segoe UI”);
这行为
static const CString strOffice2007FontName = _T(“Tahoma”);
使用Tahoma字体就可以了。

开启Visual Studio下C++的注释TODO自动列表到TaskList窗口功能

用Eclipse写JAVA时已经习惯了在注释里写TODO,然后Tasks小窗口中就能够看到当前source页里的所有TODO,用起来很方便。这几天用VS 2010写MFC时留了很多TODO,才发现开了VS的Task List窗口竟然看不到代码页里的TODO位置,看了一下M$的官方Blog发现原来只有VC++用这个功能时是需要手动开启的,VB、C#都是直接开启的。VC++开启这个功能的位置如下:
Tools->Options->Text Editor->C/C++->Formatting-> Miscellaneous->Enumerate Comment Tasks。
官方说法这个选项在C++里被默认关闭的原因是due to performance reasons。

取得windows中一些特殊文件夹路径的方法

比如当前用户的documents文件夹、windows安装文件夹等,虽然一些软件的默认文档保存位置通过这种方式取得感觉有点恶心,不过在用户未指定默认目录的情况下通过这种方式取得的路径还是比较合理的。

以下内容转抄自Visual C++ Tips,原始链接:http://weseetips.com/2008/05/01/how-to-get-the-path-of-special-folders-in-windows/

Windows have a number of special folder such as my documents, desktop folder etc. They are special because, their path can be different in system to system. So how can you get the path of special folder in windows?

Continue reading…

[转]Visual studio 2008/2010 MFC程序Menu、Toolbar字体偏小解决办法

原文:http://www.blogjava.net/luchunwei/archive/2010/06/09/323118.html

首先,这是一个MFC的Bug
http://connect.microsoft.com/VisualStudio/feedback/details/505466/mfc-visual-style-font-size-too-small-to-display-chinese-character-clearly-on-windows-xp

解决时间暂时还不确定,临时的方案如下:
App在InitInstance中加入:

Continue reading…