是什么导致内存中未处理的异常:堆栈溢出
what is causing Unhandled exception at memory : Stack overflow
我是 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];
}
}
堆栈 space 有限。假设 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 };
只会将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);
我是 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];
}
}
堆栈 space 有限。假设 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 };
只会将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);