Stack vs. Heap
来源:互联网 发布:2016欧洲杯数据统计 编辑:程序博客网 时间:2024/04/28 12:59
要注意的是:
如果你的对象需要在其他函数中使用就不能在栈上分配。因为在栈上的对象会随着
函数的返回而消亡。
如果你需要一个可变长度的对象也不能在栈上分配,因为栈上分配的内存必须在编
译的时候就要确定。
当你定义一个对象(比如类的实例)在栈上。当这个对象生命期结束的时候,会自
动调用析构函数来打扫内存。相反,如果你是在堆上分配的,那么你必须警觉内存
泄露的问题!
举个例子:
- <code>
- // ** Stack Allocation **
- {
- // Allocate MyClass instance on the stack
- MyClass c;
- … use c
- } // c destructor called by C++ compiler
- // ** Heap Allocation **
- {
- // Allocate on the heap
- MyClass * ptrC = new MyClass();
- …use heap-allocated instance
- ptrC->DoSomething(…);
- } // Destructor *not* called here! Memory leak!
- // Must do an explicit delete ptrC;
- </code>
总之,如果你只是一个小的对象,你可以在栈上分配内存。相反,如果你的对象要
占用大量内存。你就应该在堆上分配。
同时注意到,C++ 的STL容器类 (比如 std::vector)是可以分配在栈上的。但是
请注意,其内部实现中的内存分配实际上是在堆上进行的。比如:
std::vector<double>someData(1000)
这个向量对象(someData)是分配在栈上的。没错吧?可是 ,其内部数据(这1000个
double类型的值)是通过std::vector的内部机制分配在堆上的。
总之,如果一个对象需要在其局部作用域之外存在,就需要在堆上分配内存。反之
,就在栈上分配内存才合适。
另外,当我们在堆上分配内存的时候,使用一些标准库里面的类型(CArray or
std::vector )是一个比较好的选择。因为有其生成的对象的析构函数保证在其离开
作用域的时候正常的调用,而不会产生内存泄露等严重问题。
- Case 1:
- Poor strategy:
- CMyDIalog * dlg = new CMyDialog;
- dlg->DoModal();
- //…
- delete dlg;
- Good strategy:
- CMyDialog dlg;
- dlg.DoModal();
- //…
- Case 2:
- Poor strategy:
- LPBYTE b = new BYTE[size];
- //…
- delete b;
- Good strategy:
- CByteArray b;
- b.SetSize(size);
- or
- std::vector<BYTE> b;
- b.resize(size);
- Case 3:
- Poor strategy:
- LPDWORD d = new DWORD;
- *d = 0;
- Function1(d);
- //…
- delete d;
- Good strategy:
- DWORD d = 0;
- Function1(&d);
- // …
- Case 4:
- Poor strategy(failing strategy):
- TCHAR buffer[COMPILE_TIME_SIZE];
- read_stuff_into(buffer);
- PostMessage(WM_USE_DATA, (WPARAM)buffer);
- Good strategy:
- TCHAR buffer[COMPILE_TIME_SIZE];
- read_stuff_into(buffer);
- SendMessage(WM_USE_DATA, (WPARAM)buffer);
- or
- TCHAR * buffer = new TCHAR[COMPILE_TIME_SIZE];
- read_stuff_into(buffer);
- PostMessage(WM_USE_DATA, (WPARAM)buffer); //delete the pointer in the message handler
的。
如果你没有必要把内存分配在堆上那就不做
如果你需要对象存在更长的时间,请放在堆上。
- Stack vs. Heap
- Stack vs Heap Allocation
- Heap vs Stack?
- java stack vs heap
- Memory : Stack vs Heap
- stack vs heap
- Memory : Stack vs Heap
- Heap Memory vs Stack Memory
- calloc vs. malloc, stack vs. heap, register
- Static Storage vs Heap vs Stack
- Stack vs. Heap: What's the difference?
- C/C++ 内存管理 Heap vs Stack
- Java Heap Memory vs Stack Memory Difference
- 【java基础】Stack Memory VS Heap Memory
- Stack vs. Heap: Understanding Java Memory Allocation
- Java Heap Memory vs Stack Memory Difference(java Heap与Stack的区别)
- A hack for detecting stack vs heap allocated addr
- C# Heap(ing) Vs Stack(ing) in .NET: Part IV
- 想象5年后的你
- 设计模式之Factory
- 软件开发人员都应该读的一些书籍
- 配置tomcat访问日志
- 我要的生活
- Stack vs. Heap
- basic 复制文件为16进制
- linux fork 之后关闭 socket 的结构
- 数据库压缩
- 难忘的爱情电影10场经典对白
- how to show html code in html page
- 小试google 浏览器Chrome
- 探讨SQL语句编程技巧 优化DB2应用程序性能
- 用Extjs实现分页自动加载数据的Ajax实现