Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接:致命错误LNK1248:图像大小超过最大允许大小(80000000)_C++_Visual Studio 2010_Memory Management_Out Of Memory - Fatal编程技术网

C++ 链接:致命错误LNK1248:图像大小超过最大允许大小(80000000)

C++ 链接:致命错误LNK1248:图像大小超过最大允许大小(80000000),c++,visual-studio-2010,memory-management,out-of-memory,C++,Visual Studio 2010,Memory Management,Out Of Memory,我正在做一些非常大的数组处理。我做了一个全球宣言: `float array[200][1600][811];` 在MS Visual Studio 2010中构建解决方案时,出现以下错误 链接:致命错误LNK1248:图像大小(F85C8000)超过最大允许大小(8000000) 现在,我知道这相当于大约1GB的程序内存。但这一声明为float[50][1600][811]的声明起了作用,该声明的总容量为250MB。我知道默认堆栈大小非常有限。 有几件事我已经试过了。我通过属性->链接器->

我正在做一些非常大的数组处理。我做了一个全球宣言:

`float array[200][1600][811];`
在MS Visual Studio 2010中构建解决方案时,出现以下错误

链接:致命错误LNK1248:图像大小(F85C8000)超过最大允许大小(8000000)

现在,我知道这相当于大约1GB的程序内存。但这一声明为
float[50][1600][811]
的声明起了作用,该声明的总容量为250MB。我知道默认堆栈大小非常有限。 有几件事我已经试过了。我通过属性->链接器->堆栈保留大小增加了VS中的堆栈大小。这没用。我将我的可执行文件改为在x64模式下运行(据说可以寻址高达2GB的内存!)。这也没用

我不希望在数组上执行
malloc
,因为我确信我的代码中需要它们。我必须对它们进行全局声明,这样才能利用堆栈/堆内存。如果我在我的
Main()
中声明它们,它会给我内存溢出的错误

任何指点都将不胜感激。
谢谢。

如果你是
malloc
的反对者,你有两个显而易见的可能性。C++11有一个很好的数组类型,这可能会有帮助:

std::array<std::array<std::array<float, 50>, 1600>, 811> matrix;

似乎即使在构建x64可执行文件时,链接器也有更适合x86构建的限制。你对此无能为力

唯一的解决方案是从堆中分配它。这应该与原始声明的使用方式相同

typedef float partial_array[1600][811];
std::unique_ptr<partial_array> array = new partial_array[200];
typedef浮点部分_数组[1600][811];
std::unique_ptr数组=新的部分_数组[200];

您不应该(也不能)将其放在堆栈上。不要尝试。对于所有实际用途来说,堆分配对于这种大小的东西是不可避免的。现在是了解堆内存分配的正确时机。或者,这里有一个能让您感到舒适一段时间的
x64
平台。首先要问的是您是否需要首先使用阵列。如果大多数值仍设置为默认值,或者您可以按这样的顺序处理它们,使它们不必同时都在内存中,则不需要这样做。该声明不会出现在堆栈或堆上,而是进入全局进程内存。这是链接器看到它的唯一原因。@MarkB,不是100%确定。提到对数组的部分专门化将涵盖它,但我不知道它是否是标准的一部分,也不知道我的
typedef
是否会破坏它。它似乎也存在于MS之外。。。但即使没有,您也可以创建自己的删除器。在任何一种情况下,OP都可能是在运行时创建的对象(一般意义上),该对象在应用程序的生命周期内保持不变。当进程退出时,总是可以依靠主机操作系统来清理任何内存分配,对吗?懒惰,但它肯定足够了。@Rook如果它刚刚被泄露了当然,但是混合
new
delete
表单,正如我所记得的,是未定义的,而不仅仅是无害的。真的。我想完全跳过整个删除阶段。一个自定义的非删除删除器就可以了,但这似乎是一种相当迂回的方式@Rook,在这一点上,你最好使用一个哑指针。它也不会自动删除任何内容。
typedef float partial_array[1600][811];
std::unique_ptr<partial_array> array = new partial_array[200];