C++ 为什么我的.exe文件会崩溃,但在调试和发布版本中工作正常?
我正在使用openCV 2.4.11技术创建一个控制台应用程序,尝试使用透视变换从单个图像创建30多个图像 我使用matt类而不是IPLimages 控制台应用程序的调试和发布版本正常工作,但project/release文件夹中的.exe文件崩溃 这种不同行为的可能原因是什么C++ 为什么我的.exe文件会崩溃,但在调试和发布版本中工作正常?,c++,visual-studio,opencv,image-processing,release,C++,Visual Studio,Opencv,Image Processing,Release,我正在使用openCV 2.4.11技术创建一个控制台应用程序,尝试使用透视变换从单个图像创建30多个图像 我使用matt类而不是IPLimages 控制台应用程序的调试和发布版本正常工作,但project/release文件夹中的.exe文件崩溃 这种不同行为的可能原因是什么 我应该提到,发布版本也可以工作,它是唯一一个在生成几张图片后崩溃的.exe文件。这个问题可能与使用Visual Studio编译器(也可能是其他编译器)时发布和调试模式之间的内存布局不同有关 非正式地说,调试模式会在存储
我应该提到,发布版本也可以工作,它是唯一一个在生成几张图片后崩溃的.exe文件。这个问题可能与使用Visual Studio编译器(也可能是其他编译器)时发布和调试模式之间的内存布局不同有关 非正式地说,调试模式会在存储在内存中的每个对象周围添加一定量的内存。如果你愿意的话,可以算是一种填充。由于您的越界访问(在释放模式下创建分段错误)可能会落入此填充区域,因此不会触发分段错误()
然而,这是代码中的一个bug,应该加以修复,例如,通过使用
assert
添加对空指针和越界访问的检查,此问题可能与使用Visual Studio编译器(也可能是其他编译器)时版本和调试模式之间内存布局的差异有关
非正式地说,调试模式会在存储在内存中的每个对象周围添加一定量的内存。如果你愿意的话,可以算是一种填充。由于您的越界访问(在释放模式下创建分段错误)可能会落入此填充区域,因此不会触发分段错误()
然而,这是代码中的一个bug,应该加以修复,例如,通过使用
assert
添加对空指针和越界访问的检查,此问题可能与使用Visual Studio编译器(也可能是其他编译器)时版本和调试模式之间内存布局的差异有关
非正式地说,调试模式会在存储在内存中的每个对象周围添加一定量的内存。如果你愿意的话,可以算是一种填充。由于您的越界访问(在释放模式下创建分段错误)可能会落入此填充区域,因此不会触发分段错误()
然而,这是代码中的一个bug,应该加以修复,例如,通过使用
assert
添加对空指针和越界访问的检查,此问题可能与使用Visual Studio编译器(也可能是其他编译器)时版本和调试模式之间内存布局的差异有关
非正式地说,调试模式会在存储在内存中的每个对象周围添加一定量的内存。如果你愿意的话,可以算是一种填充。由于您的越界访问(在释放模式下创建分段错误)可能会落入此填充区域,因此不会触发分段错误()
不过,这是代码中的一个bug,应该加以修复,例如,通过使用
assert
添加对空指针和越界访问的检查,我找到了一个解决方案,我只是从一开始就初始化了所有矩阵,而.exe文件现在正在工作(尽管我仍然不确定第一次把什么搞砸了)。感谢大家的贡献。我找到了一个解决方案,我只是从一开始就初始化了所有矩阵,并且.exe文件现在正在工作(尽管我仍然不确定第一次把什么搞砸了)。感谢大家的贡献。我找到了一个解决方案,我只是从一开始就初始化了所有矩阵,并且.exe文件现在正在工作(尽管我仍然不确定第一次把什么搞砸了)。感谢大家的贡献。我找到了一个解决方案,我只是从一开始就初始化了所有矩阵,并且.exe文件现在正在工作(尽管我仍然不确定第一次把什么搞砸了)。感谢大家的贡献。您正在征求猜测/意见(因此您的问题将被关闭);也就是说,仅在版本中崩溃的一个可能原因是应用程序中的未定义行为。控制台应用程序工作的内容可能重复,但是.exe文件[…]崩溃?他们不是一个整体吗?在您上次编辑后,我倾向于同意@utnapistim上面的评论。请检查mat.empty()
是否适用于您的任何输入。如果是这种情况,当您在开发环境中执行.exe或启动项目时,您的程序可能会使用不同的路径,这会导致程序崩溃(试图访问找不到/无法读取的Mat)。@Mika,它没有解决我的问题。。。但是谢谢你的努力。你是在征求猜测/意见(因此你的问题将被关闭);也就是说,仅在版本中崩溃的一个可能原因是应用程序中的未定义行为。控制台应用程序工作的内容可能重复,但是.exe文件[…]崩溃?他们不是一个整体吗?在您上次编辑后,我倾向于同意@utnapistim上面的评论。请检查mat.empty()
是否适用于您的任何输入。如果是这种情况,当您在开发环境中执行.exe或启动项目时,您的程序可能会使用不同的路径,这会导致程序崩溃(试图访问找不到/无法读取的Mat)。@Mika,它没有解决我的问题。。。但是谢谢你的努力。你是在征求猜测/意见(因此你的问题将被关闭);也就是说,仅在版本中崩溃的一个可能原因是应用程序中的未定义行为。控制台应用程序工作的内容可能重复,但是.exe文件[…]崩溃?他们不是吗