如何在 C++ 中创建一个位于堆而不是堆栈的数组?

Posted

技术标签:

【中文标题】如何在 C++ 中创建一个位于堆而不是堆栈的数组?【英文标题】:How do I create an array in C++ which is on the heap instead of the stack? 【发布时间】:2010-10-15 02:51:15 【问题描述】:

我有一个非常大的数组,它的长度必须是 262144 个元素(将来可能会更大)。我试过像这样在堆栈上分配数组:

#define SIZE 262144
int myArray[SIZE];

但是,当我尝试添加超过某个点的元素时,当我尝试访问它们时,这些值似乎有所不同。我知道这是因为堆栈上只有有限数量的内存,而不是具有更多内存的堆。

我尝试了以下方法,但运气不佳(无法编译):

#define SIZE 262144
int *myArray[SIZE] = new int[SIZE];

然后我考虑使用malloc,但我想知道是否有更类似于 C++ 的方式来执行此操作...

#define SIZE 262144
int *myArray = (int*)malloc(sizeof(int) * SIZE);

我应该选择malloc吗?

【问题讨论】:

在您的第二个代码块中将“myArray[SIZE]”更改为“myArray”。 Vijay,这不是学习语法的问题。第一个选项是正确的,除了大小,第二个选项是一个足够常见的错误,值得一提。另外,这个网站不也是在有人不懂语法的时候提供帮助吗? 在问题中出现语法错误并不意味着它是一个坏问题。 直接来自常见问题解答:没有问题太琐碎或太“新手”。对那些可能不知道你所知道的一切的人要宽容。带上你的幽默感。 Vijay,也许这个网站不适合你。论坛通常是引发激烈争论的最佳场所,您应该去看看。我对 Stack Overflow 的体验是,用户可以提出他们想问的任何问题,无论多么新鲜。 【参考方案1】:

由于数字在编译时不一定知道,所以类型是指针:

int *myArray = new int[262144];

【讨论】:

感谢编译。但是,即使在使用堆内存之后,分配后我的数组末尾仍然有随机数。有什么想法吗? 我不知道。将您分配的方式发布到问题中,以便我们所有人都可以查看【参考方案2】:

new 在堆上分配。

#define SIZE 262144
int * myArray = new int[SIZE];

【讨论】:

【参考方案3】:

第一次尝试失败的原因是语法不正确。试试这个:

int *myArray = new int[SIZE];

【讨论】:

【参考方案4】:

我相信

#define SIZE 262144
int *myArray[SIZE] = new int[262144];

应该是

#define SIZE 262144
int *myArray = new int[262144];

或者更好

#define SIZE 262144
int *myArray = new int[SIZE];

【讨论】:

【参考方案5】:

您使用new 的语法错误,应该是:

int *myArray = new int[262144];

您只需要将尺寸放在作业的右侧。

但是,如果您使用的是 C++,您可能希望使用 std::vector(您将拥有)或类似 boost::scoped_array 的东西来简化内存管理。

【讨论】:

std::vector 也应该被推荐,因为它实际上是 C++ 的一部分,而不仅仅是对语言的“很好的补充”。【参考方案6】:

你会想像这样使用 new:

int *myArray = new int[SIZE];

我还会提到另一面,以防万一......

自从您从堆栈过渡到堆后,您还需要在完成后清理此内存。在堆栈上,内存会自动清理,但在堆上,你需要删除它,因为它是一个数组,你应该使用:

delete [] myArray;

【讨论】:

【参考方案7】:

更多的 C++ 方法是使用向量。然后你就不用担心完成后删除内存;矢量将为您完成。

#include <vector>

std::vector<int> v(262144);

【讨论】:

+1,但 boost::shared_array 可能更适合超大数组,具体取决于用例。 这听起来好像矢量非常适合他的情况。如果数组可以在堆栈上工作,那么向量将很好地替换数组。 是的,我考虑过向量...我只是认为数组在内存方面会更好,但考虑一下,这没有任何意义...向量甚至可能更节省内存,对吗? @Nick:它不会更高效,但使用起来会更容易、更安全。 @Cache:您可以轻松地将矢量数据传递给 api 的预期指针。 vector 的元素保证是连续的。 &v[0] 让你得到一个指向内部缓冲区的指针。

以上是关于如何在 C++ 中创建一个位于堆而不是堆栈的数组?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建一个大数组 [重复]

如何在 C++ 类中创建 const 数组和计算 const 值?

如何在 C++ 中创建类对象的向量?

如何在 C++ 中创建类似于 Python 的 numpy 数组的数组?

如何根据字符串数量的输入在 C++ 中创建数组?

如何在C++中创建一维动态数组