Getter返回错误的值

时间:2015-01-06 10:13:08

标签: c++ gdb getter

我有特殊问题。我正在与其他人的库(GPc)一起工作并且存在一些问题所以我想调试它。似乎一个简单的getter返回了一个错误的数字。我在吸气器里面放了一个完整性检查印刷品,它也失败了。吸气剂是:

unsigned int getNumData() const {
  std::cout << "nData = " << nData << "\n";
  return nData;
}

看起来微不足道,没有什么可能出错的。但是,当我运行它时,它会打印并返回错误的数字。我尝试用gdb调试它,看到结果:

CGaussianNoise::initStoreage (this=0x7fffffffd2b0) at CNoise.cpp:313
313   int m = getNumData();
(gdb) s
CNoise::getNumData (this=0x7fffffffd2b0) at CNoise.h:161
161     std::cout << "nData = " << nData << "\n";
(gdb) p nData
$44 = 500
(gdb) n
nData = 0
162     return nData;
(gdb) n
163   }
(gdb) 
CGaussianNoise::initStoreage (this=0x7fffffffd2b0) at CNoise.cpp:314
314   int n = getOutputDim();
(gdb) p m
$45 = 0
(gdb) p nData
$46 = 500

nData的预期值(根据输入)是500.当我在getter开头的gdb中打印它时,似乎没问题。但是使用std :: cout的子序列打印输出为零。并且返回的值也是零......这怎么可能?

编辑:调用的回溯日志:

#0  CNoise::getNumData (this=0x7fffffffd2b0) at CNoise.h:161
#1  0x00000000004448ce in CGaussianNoise::initStoreage (this=0x7fffffffd2b0) at CNoise.cpp:313
#2  0x0000000000415bdc in CNoise::setTarget (this=0x7fffffffd2b0, vals=0x7fffffffd5c0)
at CNoise.h:194
#3  0x0000000000415cad in CGaussianNoise::CGaussianNoise (this=0x7fffffffd2b0, pyin=0x7fffffffd5c0)
at CNoise.h:320
#4  0x0000000000407fbc in CClgp::learn (this=0x7fffffffded0) at gp.cpp:369
#5  0x00000000004047cb in main (argc=8, argv=0x7fffffffe178) at gp.cpp:39

Edit2:我尝试在存储nData的内存上设置一个rwatch,显然它已经设置但从未读过:

(gdb) info break
Num     Type            Disp Enb Address            What
...
9       read watchpoint keep y                      *0x7fffffffd420
10      hw watchpoint   keep y                      *0x7fffffffd420
    breakpoint already hit 1 time

1 个答案:

答案 0 :(得分:1)

我仍然不确定问题是什么,但这似乎与它有关:Calling virtual functions inside constructors。在我清除了CGaussianNoise构造函数中对虚方法的所有调用并将代码直接移到内部(虽然丑陋的代码重复)之后,它停止了做这些奇怪的事情......

第二种可能的解释是,由于项目的Makefile存在一些问题,其中一个源文件是针对不同的库编译的,将它们链接在一起时存在一些冲突,可能是内存冲突。