new abc() 和 abc a = new() 的区别

darkduck9989 2012-07-27 03:31:05
1 new abc()是创建个临时对象吗?

2 如果abc类是个窗体类 abc a = new() 后面需要 a.showwindow() 那用 new abc()时该怎么写showwindow()函数?
是在abc的构造函数中写吗?

3 这两种方法各自的优势是什么,一般用在什么地方?

...全文
311 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimette 2013-04-02
  • 打赏
  • 举报
回复
您好, 由于您长时间不结贴,上一次答复已超一个月并且已有最佳答案,本人帮你结贴。 若是觉得答案不嘉,请放在本版的疑难杂症帖链接: http://bbs.csdn.net/topics/390351579。 如果您有什么意见,请您联系我。
Motolola 2012-07-31
  • 打赏
  • 举报
回复
1 是生成一个临时对象,并在这行代码执行完后释放,常用在输入参数
2 是生成一个局部对象,在离开作用范围时释放
  • 打赏
  • 举报
回复
1.不是临时对象,是堆上的
2.(new abc())->ShowWindow(SW_SHOW),但构造函数里一定要Create否则无法显示
3.第一种方法比较罕见,正常情况下恐怕没人推荐,虽然我们的项目里有些地方用到这种方法了;第二种常见
loving_hoping 2012-07-30
  • 打赏
  • 举报
回复
class Abc : public CWnd
{
……
}
new Abc()这是在堆上分配内存,并调用类Abc的默认参数的构造函数,返回值是一个指向Abc实体的指针
其通常调用如下:
Abc * p = new Abc();或 Abc * p = new Abc;(调用Abc的默认构造函数)
p->showwindow(SW_SHOW);
对于Abc a = new()这种我没见过,估计编译会有问题,
若是
Abc a;
a.ShowWindow(SW_SHOW);
对象a处于栈内存中,其分配释放内存速度略快与堆内存。
傻X 2012-07-30
  • 打赏
  • 举报
回复
1.第一个叫无名对象,堆上面的,跟NEW在一起混的都这样,有用的,有时候入参什么的就这么用。
2.指针就这么new,对象实体初始化不用这么复杂abc a;就已经初始化了
3.看你怎么用了,new的生命周期都要自己控制的,不然就内存泄漏。实体会根据其位置来对应上生命周期。自动释放(主要会自动调用析构函数)
wltg2001 2012-07-30
  • 打赏
  • 举报
回复
其实第一种用法很少见到,因为没法引用。
she8275081 2012-07-30
  • 打赏
  • 举报
回复
看到过一同事用第一个作为参数的用法。。
就是函数需要一指针 。而直接用F(new abc())。
darkduck9989 2012-07-30
  • 打赏
  • 举报
回复
回8楼,是写错了
abc *a = new abc();
darkduck9989 2012-07-30
  • 打赏
  • 举报
回复
我觉得应该是类来管理释放,在这个程序里在该窗口失去焦点时(OnKillFocus)会调用关闭窗口程序并释放资源
void ColorSkinWindow::OnFinalMessage(HWND hWnd)
{
CDUIWnd::OnFinalMessage(hWnd);
delete this;
}
yyyyy_3 2012-07-30
  • 打赏
  • 举报
回复
abc a = new()
不应该这样写.
wltg2001 2012-07-30
  • 打赏
  • 举报
回复
1 new abc()是创建个临时对象吗?
===========
问题是这种创建方式创建的对象如何引用呢?如何释放呢?
darkduck9989 2012-07-30
  • 打赏
  • 举报
回复
顶啊,再没回答就结贴了
avcodec-decoder 2012-07-27
  • 打赏
  • 举报
回复
new了一个东西之后,并不是内存泄露,因为可以在new的对象里面处理。特别是当前是新建的一个窗口
darkduck9989 2012-07-27
  • 打赏
  • 举报
回复
应该是在类里面释放内存的

void ColorSkinWindow::OnFinalMessage(HWND hWnd)
{
WindowImplBase::OnFinalMessage(hWnd);
delete this;
}
youngwolf 2012-07-27
  • 打赏
  • 举报
回复
ColorSkinWindow类应该是重载了new操作符,否则上面的内存泄漏怎么解决?
是不是要保存一个临时变量,是要看代码要求的,比如你要操作:
a->b->c->d->e;

那你是不是觉得这样:
E e = a->b->c->d->e;
e->...
更好一点呢?
darkduck9989 2012-07-27
  • 打赏
  • 举报
回复
回1楼:
我是看DuiLib开源界面库时遇到的:

调用处
CRect rcWindow;
GetWindowRect(m_hWnd, &rcWindow);
rcWindow.top = rcWindow.top + msg.pSender->GetPos().bottom;
new ColorSkinWindow(this, rcWindow);

类的构造函数:

ColorSkinWindow::ColorSkinWindow(MainFrame* main_frame, RECT rcParentWindow)
: main_frame_(main_frame)
, parent_window_rect_(rcParentWindow)
{
Create(NULL, _T("colorskin"), WS_POPUP, WS_EX_TOOLWINDOW, 0, 0);
ShowWindow(true);
}
youngwolf 2012-07-27
  • 打赏
  • 举报
回复
是谁在像你第一行那样写?意义何在?

除非是当成参数传递给一个函数,那就等于第二种了。
你要操作这个对象,当然要保存下来。什么都在构造函数里搞定很难。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧