有没有办法在 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/