如何在 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++ 类中创建 const 数组和计算 const 值?