关于实例化一个对象的两种模式,为什么不选择更安全的方式

关于实例化一个对象的两种方式,为什么不选择更安全的方式
举例:在一个函数内,如果我要用DC进行绘图,可以有两种处理方式(MFC环境):

方式一:(用new分配内存)
Function1()
{
  CClientDC *pDC;
  pDC = new CClientDC(this);
  pDC->SelectObject(....);
  pDC->TextOut(.....);

  ....

  delete pDC;

}

方式二:(直接定义一个类对象)
Function2()
{
  CClientDC dc(this);
  dc.SelectObject(........);
  dc.TextOut(......);

  ....

}


显然,方式二的代码更简洁,也更安全(不需要人工delete释放资源,函数调用完自动释放dc(?))
那么为什么看到的大多数代码都用方式一去编写呢?

请高手指教!谢谢!

注:这里只是以CClientDC类举例,问题的关键是,为什么一般先声明一个类对象的指针后再动态创建对象,而不是直接定义成类对象,而且只用一个“.”访问对象的成员函数,比那个“->”更节省打字工作量啊


------解决方案--------------------
1.this指针指向的是当前的对象,使用CClientDC dc(this); 
会调用拷贝构造函数,如果没写拷贝构造函数,那么this,dc这两个
其中一个改变都会造成另外一个改变,使用new开辟空间是pDC和this指向不同的
空间,就不会出现上面的情况。
2.指针使用起来较灵活,但也容易出错。
3.一般情况下使用这两个的哪一个都可以
------解决方案--------------------
嗯,仅从C++语言的角度,实在是很难看出二者的区别。
难道是因为不想在栈上定义大对象?楼主可以试着输出一下sizeof(CClientDC),看看有多大。
------解决方案--------------------
"大多数代码"?
------解决方案--------------------
当然是2好
------解决方案--------------------
探讨
回复2楼:
你的意思是方式一定义的对象不是在栈上建立的吗? 不过你的话让我想起来,是不是在函数内定义的对象等函数执行完了,内存并没释放,而是等窗口类甚至应用程序结束时才释放?

------解决方案--------------------
探讨
当然是2好

------解决方案--------------------
探讨
引用:
当然是2好


不用比较了,第一种方式纯属吃饱没事干。

------解决方案--------------------
探讨
引用:
引用:
当然是2好


不用比较了,第一种方式纯属吃饱没事干。

1L的第一点是否存在?

------解决方案--------------------
效果一样,但系统内存的操作不同,应向合理的方向靠近,感觉2种是教科书的东西
------解决方案--------------------
我基本没见到过楼主所说的第一种方式。

若说是自绘时,
C/C++ code

CDC* pDC = CDC::FromHandle(lpDIS->hDC);
...

------解决方案--------------------
没仔细研究过。。。
------解决方案--------------------
基本没见过第一种
------解决方案--------------------
如果类对象比较大,栈上放不下,比如有个成员char m_sz[10000000],那只能用第一种方式创建。不过一般设计好的类不会这样,1,2种方式创建都可以。

第2种方式适合局部变量,临时使用一下对象,用完出作用域就销毁了,比较方便。但是如果是很多地方都用到,还是用第1种方式好一点。
------解决方案--------------------
习惯了就好了,偶一般用第二个
------解决方案--------------------
两种方式一样,第一种方式我也见过的,好象在一本VC入门的书本上见过,好久了难记起来了。
------解决方案--------------------
探讨
结论:
如果要创建的对象比较大,尽量用“方式一”创建对象
如果对象比较小,且为了获取访问速度(栈对象速度比堆对象寻址快,因为堆空间太大),就尽量用“方式二”创建对象
请高手点评