(转)孟岩的c++感悟

      写的不错的一篇文章,近来接触了一些其他语言之后,深感C++的诸多不便之处,且不论此文观点对与否,自己看看,结合着想一想就好。

正文开始

原始链接: http://blog.csdn.net/myan/archive/2010/10/09/5928531.aspx

Function/bind可以是一个很简单的话题,因为它其实不过就是一个泛型的函数指针。但是如果那么来谈,就没意思了,也犯不上写这篇东西。在我看来,这个事情要讲的话,就应该讲透,讲到回调(callback)、代理(delegate)、信号(signal)和消息传递(messaging)的层面,因为它确实是太重要了。这个话题不但与面向对象的核心思想密切相关,而且是面向对象两大流派之间交锋的中心。围绕这个问题的思考和争论,几乎把20年来所有主流的编程平台和编程语言都搅进来了。所以,如果详尽铺陈,这个话题直接可以写一本书。

写书我当然没那个水平,但这个题目确实一直想动一动。然而这个主题实在太大,我实在没有精力把它完整的写下来;这个主题也很深,特别是涉及到并发环境有关的话题,我的理解还非常肤浅,总觉得我认识的很多高手都比我更有资格写这个话题。所以犹豫了很久,要不要现在写,该怎么写。最后我觉得,确实不能把一篇博客文章写成一本20年面向对象技术史记,所以决定保留大的架构,但是对其中具体的技术细节点到为止。我不会去详细地列举代码,分析对象的内存布局,画示意图,但是会把最重要的结论和观点写下来,说得好听一点是提纲挈领,说的不好听就是语焉不详。但无论如何,我想这样一篇东西,一是谈谈我对这个事情的看法,二是“抛砖引玉”,引来高手的关注,引出更深刻和完整的叙述。

继续阅读

一个有趣的问题

代码如下:

#include "stdafx.h"
#include <iostream>
#include <float.h>

int _tmain(int argc, _TCHAR* argv[])
{
	_controlfp(_MCW_PC, _PC_24);

	volatile unsigned long dw = 0x80000052;

	unsigned long di = 0;

	std::cin >> di;
	dw += di;

	double d1 = dw;
	double d2 = (int)dw;

	volatile unsigned long dw1 = (unsigned long)d1;
	volatile unsigned long dw2 = (unsigned long)d2;

	printf("%.8x %.8xn", dw1, dw2);

	return 0;
}

 

这段代码乍看没什么问题,只是将一个无符号的数字转换为双精度,再转换回无符号整型,但是运行Debug版和Release版会发现结果完全不同,查看汇编代码如下

继续阅读

程序运行完毕出现 Run-Time Check Failure #2 – Stack around the variable ‘App’ was corrupted.

这几天一直被这个问题所困,代码如下

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow)
{

	YGEGame Game;

	YGEAppParam AppParam;
	AppParam.hInstance = hInst;
	AppParam.pApplication = &Game;
	AppParam.hPrevInst = hPrevInst;
	AppParam.bWindowed = true;
	AppParam.bMulti = false;
	AppParam.bShowMouse = true;
	AppParam.uScreenHeight = 600;
	AppParam.uScreenWidth = 800;
	_tcsncpy_s( AppParam.szAppName, (TCHAR*)"Sample", DEFAULT_TITLE_NAME_LEN );
	_tcsncpy_s( AppParam.szWndTitleName, (TCHAR*)"This is Only a Sample :)", DEFAULT_TITLE_NAME_LEN );

	YGEAppFrame App;
	if( App.CreateApplication( AppParam ) )
	{
		App.RunApplication( );
	}
	return 0;
}

每次运行到return 0 之后,就会弹出消息:

Run-Time Check Failure #2 – Stack around the variable ‘App’ was corrupted.
继续阅读

关于C++类型转换的问题

问题:今天做了一个改动,就是将CEGUI的D3D9Renderer从游戏的渲染模块挪到了Adapter模块,由Adapter统一管理所有的GUI事务,包括GUI 的渲染工作,但是问题出现了,Renderer在初始化成功之后,再被Sample调用的时候,突然变成了无效的指针(不为空,是地址被改动了,里头的所有成员均未初始化),导致程序宕掉。

解决:原因,在将基类指针转换为其派生类指针时用了强行转换导致的……改用static_cast问题就解决了,不过看了网上的资料后,貌似用dynamic_cast更适合,HOHO。

 

关于类型转换的相关资料:

C++类型转化分析 http://blog.csdn.net/qychjj/archive/2009/11/28/4896411.aspx