我有一个堆栈分配std::vector
被一些流氓代码覆盖。被覆盖的不是数据,而是内部状态。我知道这一点是因为size()
成员函数有时会在程序中返回一个垃圾值。它正确初始化。我怀疑我的代码中其他地方存在一个常见的指针错误。
我正在使用Xcode 4.6.2。我想在对向量的第一个内存位置(向量本身,而不是数据)进行内存访问时设置一个硬件断点(使用lldb),这样我就可以看到是什么覆盖了它。根据这个我需要先找到向量的地址。通常人们会使用&
运算符来获取变量的地址,但由于某种原因,lldb 不会返回地址,而是打印某种摘要字符串。
class myClass {
public:
myClass() : myVector(4) {}
private:
std::vector<double> myVector;
double myDouble;
};
在构造完所有内容后在任意断点处中断后:
(lldb) frame variable &myObject.myVector
(std::vector<double, std::allocator<double> > *) $7 = size=4
'expr' 具有相同的结果:
(lldb) expr &myObject.myVector;
(std::vector<double, std::allocator<double> > *) $8 = size=4
通常我希望看到打印的地址,例如这个普通的数据成员:
(lldb) frame variable &myObject.myDouble
(double *) &myDouble = 0x0000000125589328
我尝试将地址分配给带有“expr”的变量,但这也不起作用:
(lldb) expr std::vector<double, std::allocator<double> > * f = &myObject.myVector; f
(std::vector<double, std::allocator<double> > *) $12 = size=0
那里返回的零大小(而不是 4)表明它实际上并没有选择正确的向量。
那么如何获取这个向量的地址呢?如果我在 Xcode 的帧变量列表中右键单击它,然后选择此向量的“查看内存”,那么它会打开一个视图,0x0
其中当然是无效的。请注意,向量是在堆栈上分配的——它实际上在其他一些对象中,但所有这些都是堆栈构造的。
请注意,我不想获取向量中数据的地址——这实际上并没有被覆盖。损坏的是堆栈分配的向量对象的内部存储。