[UE4]C++创建对象的三种方式
2024-09-01 06:55:27
#include <iostream>
using namespace std;
class A
{
private:
int n;
public:
A(int m):n(m)
{ }
~A(){}
};
int main()
{
A a(); //栈中分配
A b = A(); //栈中分配
A* c = new A(); //堆中分配
delete c;
return ;
}
第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放。采用第三种方式时,必须注意一下几点问题:
- new创建类对象需要指针接收,一处初始化,多处使用
- new创建类对象使用完需delete销毁
- new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
- new对象指针用途广泛,比如作为函数返回值、函数参数等
- 频繁调用场合并不适合new,就像new申请和释放内存一样
- 栈的大小远小于堆的大
- 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多
最新文章
- C#实现:给定任意要给字符串,输出所有可能的回文的子字符串集合。
- perl基本语法--转载
- j2ee log4j集中式日志解决方案logpool-v0.4发布说明
- IE11无法 登陆银行网站
- js错误:对象不支持此属性或方法
- java关键字-transient
- Mac OS X安装之虚拟机环境下的总结
- Tweak 中系统方法写入文件到根目录下面失败
- html页面头部里的meta
- Oracle-05:伪表dual
- 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
- DBA思考系列&mdash;&mdash;学会拒绝不合理的需求
- at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
- MySQL冷知识
- 怎样让CodeBlocks支持C99
- 在vue中使用animate.css
- Forcing restore from package sources
- BZOJ3196:二逼平衡树(线段树套Splay)
- druid问题记录
- poj 2965 The Pilots Brothers&#39; refrigerator (dfs)