首页 > 解决方案 > 是什么导致内存出现未处理的异常:堆栈溢出

问题描述

我是 C++ 新手,我正在自己实现 Canny 边缘检测器算法。为此,我声明了一些二维数组。它给了我错误“ConsoleApplication3.exe 中 0x000A1809 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000、0x00E92000)”

我最小化了数组的元素数量,并且它起作用了。但是当我需要包含更多元素的数组时

//2.Gradian Calculation: a.Calculating Gx and Gy   b.Calculation sqrt(Gx^2 + Gy^2)   c.Calculating the gradiant orientation
int Fx[3][3] = { {-1,0,1},{-2,0,2},{-1,0,1} };
int Fy[3][3] = { {1,2,1},{0,0,0},{-1,-2,-1} };
int image[100][100] = { 50 };
int gradian_x[100][100] = { 0 };
int gradian_y[100][100] = { 0 };
double edgeStrength[100][100] = { 0 };

//Calculating Gx
for (int i = 1; i < 99; i++)
{
    for (int j = 1; j < 99; j++)
    {
        gradian_x[j][i] = image[j - 1][i - 1] * Fx[0][0] + image[j][i - 1] * Fx[1][0] + image[j + 1][i - 1] * Fx[2][0] + image[j + 1][i + 1] * Fx[2][2] + image[j][i + 1] * Fx[1][2] + image[j - 1][i + 1] * Fx[0][2];

    }
}

标签: c++stack-overflow

解决方案


堆栈空间有限。假设int在您的平台上是 4 个字节并且double是 8 个字节,则您要求 195 kiB 内存,它可能在堆栈中可用,也可能不可用(忽略堆栈中任何其他必要的东西,如函数调用等)。

为了存储更大的数据集,您应该使用动态内存分配std::vector(它使用堆内存而不是堆栈内存,堆栈内存比堆栈大得多):

const int initialValue = 50;
std::vector<std::vector<int>> image (100, std::vector<int>(100, initial_value);

请注意,它将int image[100][100] = { 50 };初始化为 50,其余元素初始化为 0。它在上面的示例中是固定的(所有元素都在那里初始化为 50),但是如果您想保留该行为,则应使其等于 0并直接更改。 image[0][0]initial_valueimage[0][0]


为了提高性能,您最好使用专门的库,例如Eigen. 如果您不想要外部资源,您可能想要使用std::vector<std::array<int, 100>>,它将在单个块中分配内存(更适合处理器缓存):

std::array<int, 100> initialArray;
std::fill(initialArray.begin(), initialArray.end(), 50);
std::vector<std::array<int, 100>> image (100, initialArray);

推荐阅读