C++如何在堆栈上动态分配内存?

标签 c++ memory memory-management

有没有办法在 stack 上分配内存?而不是堆?我找不到这方面的好书,这里有人有想法吗?

最佳答案

使用 alloca() (有时称为 _alloca()_malloca() ),但 be very careful about it — 当你离开一个函数时它会释放它的内存,而不是当你超出范围时,所以如果你在循环中使用它,你会很快崩溃。

例如,如果您有类似的功能

int foo( int nDataSize, int iterations ) 
{
   for ( int i = 0; i < iterations ; ++i )
   {
      char *bytes = alloca( nDataSize );
      // the memory above IS NOT FREED when we pass the brace below!
   } 
   return 0;
}  // alloca() memory only gets freed here

然后alloca() 将分配一个额外的 nDataSize 字节每次通过循环。在您从函数返回之前,不会释放 alloca() 字节。因此,如果您有一个 1024 的 nDataSize 和一个 8 的 iterations,您将在返回之前分配 8 KB。如果您的 nDataSize= 65536 和 iterations = 32768,您将分配总共 65536×32768=2,147,483,648 字节,几乎可以肯定会破坏您的堆栈并导致崩溃。

轶事:如果你写超过缓冲区的末尾,你很容易遇到麻烦,特别是如果你将缓冲区传递给另一个函数,并且该子函数对缓冲区的长度有错误的想法。 I once fixed a rather amusing bug我们使用 alloca() 创建临时存储空间,用于渲染 TrueType 字体字形,然后将其发送到 GPU 内存。我们的字体库在计算字形大小时没有考虑瑞典语 Å 字符中的变音符号,所以它告诉我们在渲染之前分配 n 个字节来存储字形,然后实际渲染 n +128 字节。额外的 128 字节写入调用堆栈,覆盖了返回地址并引发了非常痛苦的非确定性崩溃!

关于C++如何在堆栈上动态分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6335023/

相关文章:

c++ - 在 C++ 中释放内存期间,迭代器与指针有何不同

c++ - C(或 C++)的属性文件库

c++ - 从C++中的类声明继承

c++ - 嵌入式 web 控件 (IWebBrowser2),嵌入式 javascript 的 onkeydown 和 onkeyup 不触发

c++ - 在我调用 delete 之后仍然可以访问值,c++

Android - 如何以编程方式跟踪设备上任何正在运行的应用程序的内存使用情况?

c++ - 一个简单的电话簿程序将联系人推回到 vector 中

python - sys.getsizeof 的深层版本

C++:在被本地字符串捕获后释放或销毁 malloc 的 char *?

C++ - 删除 std::string*;堆损坏