C++语法中对象动态生成与静态生成的对比(来者有分) 在C++语法中,静态对象由于是在STACK上生成,因而比动态生成对象的效率要高,而且不会造成内存泄露。而我发现在实际工作中,一般都是动态生成对象(用NEW),动态生成有什么好处吗?我觉得在只需要静态生成,就能完成我所需要的功能呀 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 动态的高效利用内存空间,操作方便,而且用时NEW,不用时delete。静态对象在定义时分配空间,直到出了作用域才放空间。。 静态对象不是在STACK上生成,而是在静态变量区,相当于全局变量。它的生命周期是进程的运行时间,也就是说在进程运行期间一直占用内存。动态分配的内存由程序员自己掌握。 灵活,但是需要注意memory leak. 可是书上说静态对象是在STACK上的,调用结束后,它也就自动释放了呀。怎么会像上面说的,类似于全局变量呢 对,调用new的时候分配内存,调用detele的时候释放内存。局部变量作用域结束后内存被施放。 例如,我要做一个矩阵计算器,要求用户输入行数和列数,然后由用户输入矩阵的值。由于预先你不知道矩阵地行列数,因此你不知道应该声明多少个CEdit文本框。只有用户输入了,你才能够知道。这时可以考虑使用动态创建。还有MFC中的三大主干类CFrameWnd,CView,CDocument都是利用文档模板在初始化的时候动态创建的,并且利用串行化实现了C++中的Persistence特性。 给个最主要的答案你吧:原因 1:“静态对象由于是在STACK上生成,因而比动态生成对象的效率要高,而且不会造成内存泄露” 不会造成内存泄露 的原理你应该清楚吧,就是因为在你的对象生存的函数退出时,对象自动析构了。但~~~~~ 如果你的对象要在多个涵数中使用,或者要在一个函数中建立,而在另一个函数中使用(COM 就是用这种方法使用对象的),那你怎么办?当然只能是用 new 的方法了。原因 2: 函数的传址与传值的不同你应该懂吧。 标明动态对象的是一个指针,标明静态对象的是一个值。当这个对象作为别的函数的参数时,你就知动态对象的作用了。另: 如果你的对象是全局的,那静态,动态也一样:都是在程序退出时析构。都不用关心内存问题。而且动态对象可以在程序未退出进删除,这点要比静态对象强。你现在知道动态对象有多重要了吗? 有四种使用变量的方式(1)全局变量(2)静态变量(static)(3)自动变量(auto)(4)动态变量(new/delete)其中,(1)在任何时间,地点都可以直接使用(2)可以在任何时间使用,但不是任何地方都可以使用它(3在STACK上,生成速度很快,局部有效(4)的优点是可以运行时确定数量,但比较慢,容易出错. VS2010添加简单的消息编译后出错 用VS2005编写的C++程序在移植到另一台机器上时经常会遇到下面的错误????? 模拟回车按键自动关闭消息框的弹出窗口 DLL 错误签名 请大家进来帮看看,这段代码!!!!! 请问软件控制每三秒将socket断开再连接一次,每天跑十几个小时会不会搞坏硬件? IC卡操作中以目录名称选择DF时怎么填写?? 求大神赐教 sdk问题,求解 我不是太懂:如何使窗口变成不能改变大小。。。 指针问题。 在线等待!!!
静态对象在定义时分配空间,直到出了作用域才放空间。。
还有MFC中的三大主干类CFrameWnd,CView,CDocument都是利用文档模板在初始化的时候动态创建的,并且利用串行化实现了C++中的Persistence特性。
“静态对象由于是在STACK上生成,因而比动态生成对象的效率要高,而且不会造成内存泄露” 不会造成内存泄露 的原理你应该清楚吧,就是因为在你的对象生存的函数退出时,对象自动析构了。但~~~~~
如果你的对象要在多个涵数中使用,或者要在一个函数中建立,而在另一个函数中使用(COM 就是用这种方法使用对象的),那你怎么办?当然只能是用 new 的方法了。原因 2:
函数的传址与传值的不同你应该懂吧。
标明动态对象的是一个指针,标明静态对象的是一个值。当这个对象作为别的函数的参数时,你就知动态对象的作用了。另:
如果你的对象是全局的,那静态,动态也一样:都是在程序退出时析构。都不用关心内存问题。而且动态对象可以在程序未退出进删除,这点要比静态对象强。你现在知道动态对象有多重要了吗?
(1)全局变量
(2)静态变量(static)
(3)自动变量(auto)
(4)动态变量(new/delete)
其中,
(1)在任何时间,地点都可以直接使用
(2)可以在任何时间使用,但不是任何地方都可以使用它
(3在STACK上,生成速度很快,局部有效
(4)的优点是可以运行时确定数量,但比较慢,容易出错.