#|QT从栈中实例化对象与从堆中实例化对象的区别

引用两位大神的解答:
comanx:
在网上疯狂寻找答案,找到了这么一段话:
在C++中,对象是在堆栈中创建的。这样可达到更快的速度,因为当我们进入一个特定的作用域时,堆栈指针会向下移动一个单位,为那个作用域内创建的、以堆栈为基础的所有对象分配存储空间。而当我们离开作用域的时候(调用完毕所有局部构建器后),堆栈指针会向上移动一个单位。然而,在C++里创建“内存堆”(Heap)对象通常会慢得多,因为它建立在C的内存堆基础上。这种内存堆实际是一个大的内存池,要求必须进行再循环(再生)。在C++里调用delete以后,释放的内存会在堆里留下一个洞,所以再调用new的时候,存储分配机制必须进行某种形式的搜索,使对象的存储与堆内任何现成的洞相配,否则就会很快用光堆的存储空间。之所以内存堆的分配会在C++里对性能造成如此重大的性能影响,对可用内存的搜索正是一个重要的原因。所以创建基于堆栈的对象要快得多。
我想这个问题涉及到WIN32内存管理,本人对此领域还未深入学习,还请各位高手指点。
bokei:
他们最大的区别在于,在这个函数return之后,在堆上面的对象还能够被安全的使用,而在栈上创建的对象变得不可靠。
也就是说,在堆上创建的对象,只要你不用来delete来释放,任何时候你用指向这个对象的指针都可以访问这个对象,也就是说指针指向的内存在手动释放(使用delete)前不会再被分配掉。
而在栈上面创建的对象,由于是自动释放(在这个函数return时),所以会被系统再分配给别的东西,这时候你即使保留有释放前的指针,指针指向的哪一片内存也不一定是哪个对象了。
建议你去看一下有关C/C++的书,这些都是C/C++里比较基础的东西。
一个由C/C++编译程序占用内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数参数值,局部变量值等。其操作方式类似于数据结构中栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量存储是放在一块,初始化全局变量和静态变量在一块区域, 未初始化全局变量和未初始化静态变量在相邻另一块区域。 - 程序结束后由系统释放。–>分别是data区,bbs区
4、文字常量区 —常量字符串就是放在这里。 程序结束后由系统释放–>coment区
5、程序代码区—存放函数体二进制代码。–>code区
【#|QT从栈中实例化对象与从堆中实例化对象的区别】原文地址:https://bbs.csdn.net/topics/28081
原文地址:https://www.cnblogs.com/houjun/p/4909413.html

    推荐阅读