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

28

我有一个非常大的数组,必须长度为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 吗?


1
在你的第二个代码块中将 "myArray [SIZE]" 更改为 "myArray"。 - eduffy
4
Vijay,这不是学习语法的问题。第一种选项是正确的,除了大小之外,第二种选项是一个很常见的错误,值得一提。此外,这个网站不也是为了帮助那些不理解语法的人吗? - Nathan Fellman
3
语法错误出现在问题中并不会使其成为一个糟糕的问题。 - Lena Schimmel
3
来自常见问题解答:没有问题太琐碎或者太“新手问题”。对于那些可能不知道你所知道的一切的人要保持宽容。请带上你的幽默感。 - E Dominique
或许 Vijay,这个网站不适合你。论坛往往是引发争吵的最佳场所,你应该去看看。在我的经验中,Stack Overflow 的用户可以提出任何想问的问题,不管它们有多新手。 - Nick Bolton
7个回答

74

您需要这样使用new:

int *myArray = new int[SIZE];
我也会提到这个问题的另一面,以防万一...
由于你正在从栈转移到堆,所以当你使用完后还需要清理这块内存。在栈上,内存将自动清理,但在堆上,你需要删除它,并且由于它是一个数组,你应该使用:
delete [] myArray;

26

更符合C++的方式是使用vector。这样,您就不必在完成后担心删除内存; vector会为您完成。

#include <vector>

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

+1,但根据使用情况,boost::shared_array可能更适合超大数组。 - Functastic
听起来 vector 对他的情况非常适合。如果数组可以在堆栈上工作,那么 vector 可以很好地替换数组。 - Zan Lynx
是的,我考虑过使用向量...我只是认为数组在内存方面更好,但仔细想想,这并没有意义...向量甚至可能更加内存高效,对吧? - Nick Bolton
1
@Nick:虽然不会更高效,但使用起来会更加简单和安全。 - Brian Neal
1
@Cache:您可以轻松地将向量数据传递给期望指针的API。向量的元素保证是连续的。&v[0]让您获取指向内部缓冲区的指针。 - Brian Neal
显示剩余3条评论

3

new 在堆上分配内存。

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

2
第一次尝试失败的原因是语法不正确。请尝试以下内容:
int *myArray = new int[SIZE];

2

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

int *myArray = new int[262144];

你只需要将大小放在赋值符号的右边。

然而,如果你使用C++,你可能想要考虑使用 std::vector(你会有它)或类似 boost::scoped_array 这样的东西来使内存管理变得更容易一些。


应该推荐使用std::vector,因为它实际上是C++的一部分,而不仅仅是语言的“相当不错的补充”。 - Tom

1

我相信

#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];

1

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

int *myArray = new int[262144];

谢谢编译通过。然而,即使使用堆内存,我在赋值后仍然在数组末尾有随机数。有什么想法吗? - Nick Bolton
我不知道。将您分配方式发布在问题中,这样我们所有人都可以看一下。 - Johannes Schaub - litb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接