C++ 在堆上创建静态数组?

C++ 在堆上创建静态数组?,c++,arrays,static,stack,heap,C++,Arrays,Static,Stack,Heap,我需要创建一个非常大的数组。比如说50兆字节 我可以安全地将其创建为普通静态数组吗?编译器会将其放在堆栈上(可能导致堆栈溢出),还是会足够聪明地将其放在堆上 如果没有办法做到这一点,那么有没有一种简单的方法可以在程序启动时使用malloc或“new”,但在程序结束时自动释放它?简单的方法是使用std::vector std::vector data; data.reserve(<Number of Elements); std::矢量数据; data.reserve(据我所知,静态变

我需要创建一个非常大的数组。比如说50兆字节

我可以安全地将其创建为普通静态数组吗?编译器会将其放在堆栈上(可能导致堆栈溢出),还是会足够聪明地将其放在堆上


如果没有办法做到这一点,那么有没有一种简单的方法可以在程序启动时使用malloc或“new”,但在程序结束时自动释放它?

简单的方法是使用std::vector

std::vector   data;
data.reserve(<Number of Elements);
std::矢量数据;

data.reserve(据我所知,静态变量不存在于堆栈上。如果它们存在,当您弹出它们所存在的堆栈帧时,它们会去哪里?静态函数变量需要在调用之间保持其状态,因此从逻辑上讲,静态数据应该保留在堆上


此外,当程序结束时,所有内容都会自动释放。

50兆字节按今天的标准算不上太多

可以使用C++新操作符在程序的开始分配它,并在结束时(在定义的程序段的开始/结束时)用Dele[]重新分配它。


如果此数组表示要加载的某个文件,则最好在将该文件加载到内存时分配该数组。最佳情况下,只能将文件的一部分映射到内存(例如:1MB、2MB或要使用的另一个逻辑“单元”)(请参阅Windows中的MapViewOfFile和UNIX系统中的mmap)。通过这种方式,您可以加载非常大的文件,而不会耗尽虚拟内存。

如果静态分配,它将被静态分配。在典型情况下,可执行文件中会有某种记录,指定特定变量应为大小为N的零初始化块。加载程序通常会遵守这一点,just喜欢它为程序的代码分配空间之类的(例如,它会分配地址空间,但通常不会分配实际内存来支持它,直到/除非你真的读/写了那个内存)。

根据我的经验,最好在堆上分配这么大的数组(因此通过new)-我在堆栈上分配了2MB后,在unix系统上看到一个程序内核转储。。。 如果你想自动删除,你可以使用一个智能指针(比如boost::scoped_array)。但是,既然你提到“当程序结束时自动删除它”,你实际上不需要做任何事情——当进程终止时,操作系统会回收进程的所有内存


无论如何,你真的应该使用std::vector而不是原始数组。

我不想使用std::vector。我想我可以利用析构函数,把它包装在一个类中。因为我问过数组。@Pepe:std::vector和数组在你想执行的用法上有什么不同?@Charles:
std::vector
拥有一个自己的类和一个动态分配的数组是不可能的?或者仅仅是一个普通的动态分配数组,就这点而言?@Pepe:comment+1因为它让我崩溃了啊,我想它们不会在堆栈上。所有的东西都会在堆栈上自动释放,而不是在堆上。它们不是都在为我分配的内存中吗r进程?一旦程序结束,它将被释放回操作系统。@Twisol:它们的内存将被释放,但元素的析构函数不会被调用。@Twisol:不运行析构函数是一个重大决定:能够在那里执行一些统计、记录等功能非常好。有些对象可能会使用共享内存、临时f未自动释放的文件或其他资源(在其操作系统上)此外,习惯性地删除内存可以更容易地发现valgrind、purify、insure等中的实际内存泄漏。您是指关键字static中的
static
,还是关键字static中的'not dynamic'?static。我想这也意味着它不是动态的!手动调用
new
delete
是Leakapalooza的门票。如果我我不想给LeCialAloZa买一张票,我会在Javajava中编写代码!@ FrdoVFLUT:你可以在.NET或java中仔细跟踪资源(RIAA),如果你需要C++ 2程序。