Visual C++ 6.0 中“无符号字符”数组的最大允许大小是多少?

Posted

技术标签:

【中文标题】Visual C++ 6.0 中“无符号字符”数组的最大允许大小是多少?【英文标题】:What is the maximum allowed size of an "unsigned char" array in Visual C++ 6.0? 【发布时间】:2014-11-28 13:40:14 【问题描述】:

为了处理图形,我需要一个无符号字符数组。它必须是 3 维的,第一个维度的大小为 4,(第 1 字节蓝色,第 2 字节绿色,第 3 字节红色,第 4 字节未使用)。一个 640x480 图像的简单数组是这样完成的:

unsigned char Pixels[4][640][480]

但问题是,它总是在程序运行时立即崩溃。它编译得很好。它链接良好。它没有错误或警告。但是当它运行时它立即崩溃。我还有许多其他代码行,但我发现正是这一行导致了立即崩溃。这并不是说我没有足够的 RAM 来保存这些数据。这只是很小的数据量,仅够一张 640x480 全彩图像。但是我以前只看到过这样的直接崩溃,当程序尝试读取或写入未分配的内存时(例如使用 CopyMemory API 函数,其中源或目标部分或完全在已定义变量的内存空间之外)。但这不是这样的内存读取或写入操作。这是一个内存分配操作。这永远不会失败,除非 PC 中没有足够的 RAM。而且我的电脑当然有足够的内存(没有现代电脑没有足够的内存)。有人能告诉我为什么会搞砸吗?这是 VC++ 6.0 的一个众所周知的问题吗?

【问题讨论】:

与VC++ 6.0无关。堆栈内存非常有限,在堆上分配(我建议为此使用向量,您可以将其包装起来为您处理索引)。 如果您要移植应用程序,为什么不尝试使用更新的 VC6 编译器? 请显示您用于创建此内存的完整真实代码。 您提供的代码无法编译,因为它缺少分号。这可能看起来很迂腐,但确切地知道内存是如何声明的对于诊断这个问题很重要。您似乎认为您不需要了解 C++ 中的内存是如何分配的。你会的。 @BenHutchinson:VB 和 C++ 是非常不同的语言,越早停止尝试将 VB 知识应用于 C++ 越好。 【参考方案1】:

如果这是在函数内部,那么它将在运行时分配到堆栈上。它超过一兆字节,因此对于堆栈来说可能太大了。您有两个明显的选择:

(i) 将其设为静态:

static unsigned char Pixels[4][640][480];

(ii) 使其动态化,即从堆中分配它(完成后不要忘记删除它):

unsigned char (*Pixels)[640][480] = new unsigned char[4][640][480];
...
delete[] Pixels;

如果应用程序的整个生命周期都需要该数组,则选项 (i) 是可以的。否则选项 (ii) 更好。

【讨论】:

【参考方案2】:

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

【讨论】:

这看起来相当低效!要访问A[x][y][z],需要三层间接,每层都有自己的偏移量计算,而不是多维数组的单一偏移量计算。 @TonyK 这是一个很好的观点,但是我仍然建议使用 RAII 容器,除非在特殊情况下。

以上是关于Visual C++ 6.0 中“无符号字符”数组的最大允许大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 从无符号字符数组创建 GUID

如何计算无符号字符数组中元素的平均值?

C++ - 分配一个无符号字符缓冲区,然后用一个字符串填充它

复制无符号字符数组

使用 Visual c++ 6.0 时使用啥代码

visual C++ 6.0 是先点“Compile”还是“Build”?分不分点击顺序??作用各是啥??