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

27 浏览
0 Comments

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

有没有一种方法可以在堆栈上分配内存,而不是堆上?我找不到一本关于这个问题的好书,这里有人有主意吗?

0
0 Comments

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

在C++中,通常只需要在正确的作用域中声明所需的对象。它们被分配在堆栈上,并且在作用域结束时会被释放。这是C++相对于C的一个关键优势,也是RAII的一部分。不需要malloc或new,尤其是不需要alloca。

然而,问题在于许多C++对象为自己分配内存。

当您调用一个填充向量的函数时,可能需要一个字符串。您可能需要这些东西非常快速和线程安全。如果您不需要这些东西存在于函数之外,那么堆栈存储正是正确的地方。

对于特定的应用程序,我可以理解这个需求。但我认为如果问题提出者明确了为什么需要这样做,我会更容易被说服。在大多数情况下,我认为这是不必要的。

我主要在嵌入式环境中工作,经常需要对堆分配的内存进行限制。

如果问题提出者有这样的限制,那么对他们来说情况可能会更复杂。

所以,问题的原因是在某些特定情况下,需要在堆栈上动态分配内存。解决方法是在正确的作用域中声明对象,并确保它们在作用域结束时被释放。如果需要在函数之外使用这些对象,则需要在堆上动态分配内存。

0
0 Comments

动态在堆栈上分配内存的原因是,问题明确要求动态分配内存,而不是静态分配内存。解决方法是使用动态内存分配函数,例如malloc、calloc或new。以下是一个C++示例代码,演示如何动态分配内存在堆栈上:

#include 
int main() {
    int size;
    std::cout << "Enter the size of the memory block: ";
    std::cin >> size;
    int* array = new int[size];
    // 使用分配的内存进行操作
    for (int i = 0; i < size; i++) {
        array[i] = i;
        std::cout << array[i] << " ";
    }
    delete[] array;
    return 0;
}

以上代码通过从用户输入中获取内存块的大小,然后使用`new`运算符动态分配一个int数组。然后,我们可以使用分配的内存进行操作,并在最后使用`delete[]`释放内存。

这种方法可以动态地在堆栈上分配所需大小的内存,并避免了静态分配大小固定的内存的限制。

0
0 Comments

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

在C++中,可以使用alloca()(有时称为_alloca()或_malloca())来动态分配内存,但需要非常小心。它在退出函数时释放内存,而不是在超出作用域时释放内存。因此,如果在循环内部使用它,很快就会耗尽内存。

例如,如果有一个函数如下:

int foo(int nDataSize, int iterations)
{
   for (int i = 0; i < iterations; ++i)
   {
      char *bytes = alloca(nDataSize);
      // 上面的内存在下面的大括号中不会被释放!
   }
   return 0;
}  // alloca()的内存只在这里被释放

则alloca()将在每次循环中额外分配nDataSize字节的内存。直到从函数返回之前,alloca()分配的内存都不会被释放。因此,如果nDataSize为1024,iterations为8,那么在返回之前会分配8KB的内存。如果nDataSize为65536,iterations为32768,那么总共会分配65536×32768=2,147,483,648字节的内存,几乎肯定会导致堆栈溢出并崩溃。

如果写入超出缓冲区的末尾,尤其是如果将缓冲区传递给另一个函数,并且该子函数对缓冲区的长度有错误的理解,可能会遇到麻烦。

如果在递归函数中使用alloca()会有什么副作用?还有最后一部分我不太理解,“如果在循环中使用它,就会出问题”。但是循环仍然在函数内部,对吗?

- 如果在循环中执行alloca,它将在每次迭代中分配更多的内存,但直到从函数返回时才会释放内存(而循环作用域内的类似std::vector的容器将在循环结束时被释放)。

- 你可以在递归循环中使用alloca。在普通循环中,它不会在函数返回之前释放内存,因此可能会导致堆栈溢出,但在递归循环中,它将在每次迭代中被清除。

如果函数是void类型会怎样?

- 好吧,停下来思考一下。alloca()在做什么,函数的返回类型如何影响它?

- 我认为这不会有什么区别。

这里的链接已经失效,我想阅读关于你的bug的内容!

0