导致内存中未处理异常的原因:堆栈溢出

问题描述 投票:0回答:1

我是C ++的新手,我自己实现了Canny边缘检测器算法。为此,我声明了一些2D数组。它给我一个错误“ 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
1个回答
0
投票
在0x000A1809中未处理的异常

堆栈空间有限。假设平台上的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 };会将only初始化为image[0][0]为50,其余元素初始化为0。在上面的示例中已将其固定(在那里所有元素均以50初始化),但是如果要保留该行为,则应使initial_value等于0并直接更改image[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);
© www.soinside.com 2019 - 2024. All rights reserved.