为什么很多人都喜欢new一个类,而不是直接声明一个对象呢?

zihui 2006-05-03 12:23:48
我看很多人写的代码都喜欢这样写(示例)
MyClass* pc = new MyClass();
pc->doSome();
...
delete pc;

为什么非要去new呢?而且这样很容易忘记最后delete。
为什么不按照下面这样呢?
MyClass c;
c.doSome();
....
我觉得这样很好阿,而且不需要delete。难道第一种写法有什么特别的好处吗?看到很多代码都是第一种写法。谢谢。
...全文
1897 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
pgmsoul 2006-05-07
  • 打赏
  • 举报
回复
补充一点,new 因为用的是动态内存,所以在内存空间上是优化一些.但的确,new操作要申请内存,这个过程在速度上有非常大的损失,大概要用1000个整数操作的时间.
蒋晟 2006-05-05
  • 打赏
  • 举报
回复
句柄模式是指将所有对内部对象的操作转发到一个成员变量,这样可以保护类的非公开成员的访问级别不被重载的类所更改
创建聚合对象的开销有可能很大,例如,聚合对象可能在另一个套间或者另一台计算机上.这时候可以在第一次使用到这个聚合对象提供的功能时再创建这个对象
pgmsoul 2006-05-05
  • 打赏
  • 举报
回复
我倾向于用
A a;
a.func();
而不是
A* pa = new A;
pa->func();
delete pa;
删除指针的确是麻烦.
这两者在性能上是相同的(差不多).
但如果有很多的对象(比如10000个以上),这时候可以用数组,但显然会占用栈内存,所以应该用指针.这是主要差别.new 出来的开销不一定大.
至于多态,静态声明就不可以使用吗?不明白.
作用域更是不着边,学C++的应该很清楚.
说到安全性,我认为,永远不要传递一个类的值,C++应该取消这种默认方式,看着吧,会有这一天的.甚至,C++应该把指针做为一个独特的类型,严格的和普通类型区别.
蒋晟 2006-05-05
  • 打赏
  • 举报
回复
// MyClass.h
class MyClassImpl; // forward declaration
class MyClass {
public:
MyClass();
~MyClass();
int foo();
private:
MyClassImpl *m_pImpl;
};
......
int MyClass::foo()
{ return m_pImpl->foo(); }
houdy 2006-05-05
  • 打赏
  • 举报
回复
句柄模式是指将所有对内部对象的操作转发到一个成员变量,这样可以保护类的非公开成员的访问级别不被重载的类所更改
>>>> 你说的句柄模式是不是"private implemenatation"?
Linux2001 2006-05-05
  • 打赏
  • 举报
回复 1
差别就是对于函数参数来讲,如果一个类比较大(应该可以理解什么是比较大型的类吧),那么传递指针的好处就是性能上比传递一个值要高非常非常的多,因为传值进函数还会在函数内部造成拷贝构造函数的调用,那么性能下降非常厉害,如果是函数内部声明局部变量,没有多态的考虑,那么使用声明对象的方式就可以了,这个上面和new 一个对象的差别不是很大!
逸学堂 2006-05-04
  • 打赏
  • 举报
回复
new是得对象可以由用户自己管理。
用户来决定什么时候创建对象,什么时候消耗对象。

比如lz来考虑在运行时刻添加数据成员(一个典型得例子就是用结构体存储用户信息,输入多个用户信息),这里得多个可能是0也可能是100,我们不好提前分配空间,最好在运行时刻添加一个用户,new一个结构体。
蒋晟 2006-05-04
  • 打赏
  • 举报
回复
1 可以将创建聚合对象的开销延后
2 句柄模式
WilliamJ 2006-05-04
  • 打赏
  • 举报
回复
原因很多,但主要有两个:一,为了更好的控制对象的生命期,由程序员决定.二,为了更好的使用多态.
hundlom 2006-05-04
  • 打赏
  • 举报
回复
用new是在堆上申请空间,堆的空间跟物理内存大小有关。
而静态的声明是在栈上申请空间。栈的大小有限制。
xhwen 2006-05-04
  • 打赏
  • 举报
回复
学习
Maconel 2006-05-04
  • 打赏
  • 举报
回复
我认为主要是作用域上的差别,一般能不用new,我都不用new的。
至于多态和函数参数,都不是问题:
多态可以这样用:
B b;
A* p = &b;
p->dosomething();

传参数也是一样:
函数定义:
void fn(B* b);
调用:
fn(&b);
或者这样定义:
void fn(B& b);
调用:
fn(b);
Jedimaster 2006-05-04
  • 打赏
  • 举报
回复
在HEAP里动态分配可以在后面对对象的操作中仅仅传递指针而且可以方便的实现多态

但是要注意不要内存泄露了

father* ptr = new father();
ptr = new son();//第一个father丢了
zidanjxnu 2006-05-04
  • 打赏
  • 举报
回复
学习中……
以我的认识,如果不用多态,而且这个生命周期也很短。我觉得我还是不会去new 一个,毕竟这里还是需要去释放,这里就有泄漏的可能。呵呵
houdy 2006-05-04
  • 打赏
  • 举报
回复
1 可以将创建聚合对象的开销延后
2 句柄模式
>>>> 如何理解?能不能再详细一点?
MagicCarmack 2006-05-04
  • 打赏
  • 举报
回复
继rorl(用C语言,写B+树,得A成绩) 分析

1、考虑变量的作用域。NEW分配空间必须由你自己释放,局部变量在它作用局域内使用完后会自动释放!比如在函数内NEW分配的空间就可以在函数结束后继续使用,局部变量就不可以!

2。多态性。多态最基本的需要就是指针
pottichu 2006-05-04
  • 打赏
  • 举报
回复
用指针有很多好出,楼主漫漫会发现的。
rorl 2006-05-04
  • 打赏
  • 举报
回复
自己给自己总结一下:
1。考虑变量的作用域。如果作用域不限于一个模块内,那么在模块内需要用new从堆上创建对象。不然就可以用声明对象的方式。
2。多态性。当然先声明对象,然后用基类指针指向对象也可以,但这样的程序看上去不够美观。
CrazyAzreal 2006-05-04
  • 打赏
  • 举报
回复
我有一段时间也有这样的迷惑,不过我听我的一个同事说,说直接对地址操作执行速度高一点
goodchan 2006-05-03
  • 打赏
  • 举报
回复
MyClass c;
c.doSome();
---------------------------
静态分配内存,在生成程序的时候已经确定它的内存如何分配

MyClass* pc = new MyClass();
pc->doSome();
delete pc;
---------------------------
动态分配内存,可以在程序运行的时候来决定如何分配,这样可以大大减少内存的浪费。

这些几乎所有的教科书上都有说明的,看书就行。
加载更多回复(11)

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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