程序的奇怪行为
Strange Behavior of a Program
本文关键字:程序 更新时间:2023-10-16
我的代码结构如下:
[code 1]
cout << some_string << endl
cout << some_string << endl
cout << some_string << endl
cout << some_string << endl
cout << some_string << endl
[code 2]
当我删除cout
语句时,当cout
语句存在时,代码2给出不同的输出。这是否表明存在内存泄漏?
具体示例来自OPENCV的stitching_detailed.cpp。我有以下代码块:
// code 1 - edit added cameras initialization
vector<CameraParams> cameras(0);
HomographyBasedEstimator estimator;
theRNG().state = 0;
estimator(features, pairwise_matches, cameras);
for (size_t i = 0; i < cameras.size(); ++i)
{
theRNG().state = 0;
Mat R;
cameras[i].R.convertTo(R, CV_32F);
cameras[i].R = R;
LOGLN("Initial intrinsics #" << indices[i]+1 << ":n" << cameras[i].K());
}
// cout statements
for (size_t i = 0; i < cameras.size(); ++i)
{
cout << cameras[i].aspect << endl;
cout << cameras[i].focal << endl;
cout << cameras[i].K() << endl;
cout << cameras[i].ppx << endl;
cout << cameras[i].ppy << endl;
cout << cameras[i].R << endl;
cout << cameras[i].t << endl;
}
// code 2
theRNG().state = 0;
Ptr<detail::BundleAdjusterBase> adjuster;
if (ba_cost_func == "reproj") adjuster = new detail::BundleAdjusterReproj();
else if (ba_cost_func == "ray") adjuster = new detail::BundleAdjusterRay();
else
{
cout << "Unknown bundle adjustment cost function: '" << ba_cost_func << "'.n";
return -1;
}
theRNG().state = 0;
Mat_<uchar> refine_mask = Mat::zeros(3, 3, CV_8U);
if (ba_refine_mask[0] == 'x') refine_mask(0,0) = 1;
if (ba_refine_mask[1] == 'x') refine_mask(0,1) = 1;
if (ba_refine_mask[2] == 'x') refine_mask(0,2) = 1;
if (ba_refine_mask[3] == 'x') refine_mask(1,1) = 1;
if (ba_refine_mask[4] == 'x') refine_mask(1,2) = 1;
adjuster->setRefinementMask(refine_mask);
adjuster->setConfThresh(conf_thresh);
(*adjuster)(features, pairwise_matches, cameras);
如果我删除cout
语句,相机[x]。焦点是NaN。如果我保留cout
语句,摄像机[x]。Focal有有效值。
我知道这没什么可给的,但我调试它的努力已经结束了。任何调试问题的帮助都是值得感谢的。即使你知道一个标准的调试方法,也请告诉我。
如果您通过删除看似不相关的代码来暴露bug,这几乎总是未定义行为的标志 bug存在于您的程序的某个地方,这些bug处于休眠状态,直到您的程序内存布局发生微小变化。
至于什么样的未定义行为会导致这样的bug,有多种选择。未初始化的指针,指向错误位置的指针,数组越界错误等等。
(您也可以从堆栈溢出中获得这种行为,尽管在这种情况下似乎不太可能。)
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 如何在c++程序中找到函数的地址