c++ - 是什么导致内存出现未处理的异常:堆栈溢出
问题描述
我是 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];
}
}
解决方案
堆栈空间有限。假设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_value
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);
推荐阅读
- f# - 在 F# 中将 MailboxProcessor 包装到 IObservable 中的好方法是什么?
- python - 使用 zipfile 归档每个文件的正确方法是什么?
- python - 如何判断 websocket 客户端是使用安全连接还是非安全连接?
- javascript - 异常 - 未指定值的属性:url
- javascript - 在电子应用上制作半径角
- php - Woocommerce:在产品循环中将 li 标签替换为 div 标签
- android - 未显示单选按钮自定义选择器
- python - 如何使用 selenium 和 python 查找 aria-label
- javascript - VueJS防止父组件更新时子组件更新
- exception - CompletableFuture 停止主程序