error: Program received signal SIGSEGV, Segmentation fault. (Codeblocks, C++)

关于“error: Program received signal SIGSEGV, Segmentation fault.”。

之前多次遇到的情况都是:对空指针进行了操作

比如:material_ptr->shade(sr)

若material_ptr为空指针(或者对应的指针并不是“指向某拥有shade()成员方法的对象”的指针),则可能报这个错误。


但是,今天遇到一件诡异的事情。


先交代一下事情发生的背景。本人在学习《Ray Tracing from the Ground Up》,这本教材提供了源代码,但是源代码不全,而且前后章节对应的公共代码部分有不兼容的情况。另外,还有就是原作者是在visual studio的环境下编写的。但是本人习惯使用Codeblocks, 所以需要将书上的源代码移植到Codeblocks的project上。昨天移植的代码到书本的chapter 14: Light and Materials;今天在移植chapter 15: Specular Reflection。其实一开始挺顺利的,索性将官网上提供的所有代码都移植上来,修修改改,也算移植完成了。

都已经能够生成对应的图形了,贴图如下:(反射模型为“Phong Reflection”, 光照模型为“环境光”和“平行光”)


由于生成该图形需要的时间比较长,所以就对图形进行了裁剪,也得到了如下图形:

error: Program received signal SIGSEGV, Segmentation fault. (Codeblocks, C++)_第1张图片

这段时间做了些“手欠”的事情:之前不是将后面章节的有关无关的代码也移植上来了嘛,现在时不时将多余文件移除一个。

生成如上图形之后,正想将漫反射光撤掉,看看只有镜面反射光时是什么图形。

出问题了!!!!!!!!!!!!!!

RGBColor RayCast::trace_ray(const Ray ray, const int depth) const {
ShadeRec sr(world_ptr->hit_objects(ray));

if (sr.hit_an_object) {
sr.ray = ray; // used for specular shading
return (sr.material_ptr->shade(sr));
}   
else
return (world_ptr->background_color);
}

如上红色代码通过指针call到:

RGBColor Phong::shade(ShadeRec& sr) {

Vector3D wo = -sr.ray.d;
RGBColor L = ambient_brdf->rho(sr, wo) * sr.w.ambient_ptr->L(sr);

……

}

黄底那句代码时,报错:“Program received signal SIGSEGV, Segmentation fault”。

根据之前的经验,很快定位到w的指针出现了问题。

error: Program received signal SIGSEGV, Segmentation fault. (Codeblocks, C++)_第2张图片

为什么?不知道什么原因。发现到shade()函数时,sr的成员变量中多了color成员。所以查了一下ShadeRec 类定义的地方,发现:

RGBColor color; // used in the Chapter 3 only

意思是说,“color”对于chapter 3之外的章节是多余的咯。

所以,索性将和该成员相关的代码都注释掉。还真有效果,现在从trace_ray()函数call到shade()函数w值不会变了,问题好像解决了。

但是,但是!!!!!!

刚生成一个像素点,然后在trace_ray()中跑这句代码(return (sr.material_ptr->shade(sr));)再次报错:“Program received signal SIGSEGV, Segmentation fault”。

貌似,出现问题的位置提前了。而且,现在不仅仅是在chapter 15对应的Phone材料图形生成是有问题,在生成chapter 14对应的matte材料的的图形是也存在同样的问题。

折腾了好几个小时,没有任何头绪。

尼玛!!!!心中无数神兽在奔腾!!!!


所以,无奈之举:在chapter 14的基础上重新移植chapter 15的代码。严格做到:只移植chapter 15必须的代码,绝不加入多余代码。

重新移植后,终于正常了。果断~立刻~马上备份一下。链接:http://download.csdn.net/detail/libing_zeng/9757762

引起问题的原因算是找到了:手欠,时不时将多余文件移除出项目。

但是问题背后的原理是什么还是搞不清楚。


所以,

做事情不能偷懒,不能马虎。

最重要的不要手欠。

谨记!

你可能感兴趣的:(C++,debug,C++,build,error,Segmentation,fault)