对于使用图形,我需要一个unsigned char数组。它必须是3维的,第一维尺寸为4,(第一个字节为蓝色,第二个字节为绿色,第三个字节为红色,第四个字节为未使用)。然后像这样完成640x480图像的简单数组:
unsigned char Pixels[4][640][480]
但问题是,它一直在程序运行时立即崩溃。它汇编得很好。它链接很好。它没有错误或警告。但是当它运行时它会立即崩溃。我有很多其他的代码行,但是我发现这个代码导致了直接的崩溃。它不像我没有足够的RAM来保存这些数据。它只是一小部分数据,仅适用于单个640x480全彩色图像。但是,当程序试图读取或写入未分配的内存时(例如,使用CopyMemory API函数,其中源或目标部分或完全位于已定义变量的内存空间之外),我之前只看到过此类直接崩溃。 。但这不是一种记忆读写操作。这是一个内存分配操作。这应该永远不会失败,除非PC中没有足够的RAM。而我的电脑肯定有足够的内存(没有现代电脑就没有足够的内存)。有人可以告诉我为什么它搞砸了吗?这是VC ++ 6.0的一个众所周知的问题吗?
答案 0 :(得分:3)
如果这是在函数内部,那么它将在运行时在堆栈上分配。它超过一兆字节,因此对于堆栈来说可能太大了。你有两个明显的选择:
(i)使其静止:
static unsigned char Pixels[4][640][480];
(ii)使其成为动态的,即从堆中分配它(并且在完成后不要忘记删除它):
unsigned char (*Pixels)[640][480] = new unsigned char[4][640][480];
...
delete[] Pixels;
如果在应用程序的生命周期内需要阵列,则选项(i)是可以的。否则选项(ii)更好。
答案 1 :(得分:3)
默认情况下,Visual C ++为程序提供1MB的堆栈。您尝试在堆栈上分配的数组大小为1200KB,这将破坏您的堆栈。您需要在堆上分配数组。 std::vector
是你最好的选择。
using namespace std;
vector<vector<vector<unsigned char>>> A(4, vector<vector<unsigned char>>(640, vector<unsigned char>(480, 0)));
这看起来有点混乱,但在初始化数组方面会做你想做的事情,这意味着你不必担心内存泄漏。
或者,如果这不是一个选项,则可以通过将/STACK:
后跟所需的堆栈大小(以字节为单位)传递给链接器来增加堆栈大小。
编辑:为了提高速度,您可能希望使用单个已分配的内存块:
std::unique_ptr<unsigned char [][640][480]> A(new unsigned char [4][640][480]);