C++的m_pMainWnd问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 02:00:29
请问这样两段代码的执行结果有什么区别,为什么会这样。
注:sample是一个CFrameWnd派生的类
sample *obj;
obj = new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);

sample obj;
m_pMainWnd=&obj;
obj.ShowWindow(SW_SHOWMAXIMIZED);

整个程序的代码如下:
#include <afxwin.h>

class sample:public CFrameWnd
{
public:
sample()
{
Create(NULL,"MFC Window");
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}
};

class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};

BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);

/*sample *obj;
obj = new sample;
m_pMainWnd=obj;
*/
//obj->ShowWindow(SW_SHOWMAXIMIZED);
sample obj;
m_pMainWnd=&obj;
obj.ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}

首先你既然把对象保存下来了m_pMainWnd,肯定是希望以后使用,但是如果你用sample obj;
m_pMainWnd=&obj;
这样做是没有意义的。因为obj是局部变量,等函数一返回m_pMainWnd就没有用了。

new不会有这个问题,再堆里分配

这个问题只是潜在的,从程序的运行效果上来看应该是没有区别的(在你不使用m_pMainWnd的情况下,如果使用了可能导致程序崩掉)

交谈结果:

子之清扬 09:33:41
2 听到你说NEW不会有这个问题,但我想说因为NEW生成的内存空间也会被析构函数删除的,那么,sample中的析构函数是在什么时候会清空NEW的内存
当你调用delete函数的时候析构函数才调用
子之清扬 09:34:12
3 为什么
sample *obj;
obj = new sample;
m_pMainWnd=obj;
生成的OBJ能被保存?
这是在堆里分配的,而不是堆栈,局部变量是在堆栈里分配的,过了作用域 变量就不起作用了
蔚蓝 09:38:11
delete函数 又是在什么时候被调用?
子之清扬 09:37:42
那看你想什么时候不让这个变量起作用了。如果你一直不调用,那么这个对象占用的内存就一直在那里没有人释放,就会造成内存泄漏(操作系统没法回收这部分内存)
蔚蓝 09:40:04
OK 第二个问题了解
蔚蓝 09:40:23
sample *obj; 可以使用 NEW sample
子之清扬 09:38:52

蔚蓝 09:40:31
sample obj; 为什么不可以
子之清扬 09:40:20
sample obj; obj是局部变量,生成 的内存结构和new是一样的,但是当前的函数一执行完毕,堆栈就返回了,学过汇编吧,就是esp指针就发生变化了,此时所有的堆栈变量都失去了自己的作用域,此时c的运行是系统会自动调用析构函数
子之清扬 09:41:53