为什么我不能在gdb调试器中使用“print”访问向量中的值?

时间:2013-02-11 19:13:31

标签: c++ vector gdb

我正在学习使用gdb调试器,但是当该向量包含从另一个向量复制的值时,无法访问向量的值。最终下面的程序完成了我想要它做的事情(将“nums”的值复制到一个新的向量“copyOfNums”),但是当我在“copyNums”中执行第一个for循环后我尝试检查copyOfNums [0]的值时“,无法访问内存中的值(请参阅下面的gdb会话)。

下面的副本nums执行了for语句的1个循环,所以copyNums [0]应该包含nums [0]指向的值的地址,还是应该包含对新int的引用(这与nums指向的l值[0])?无论我希望能够访问该值,但正如您从以下gdb输出中看到的那样,它是无法访问的。

Breakpoint 1, copyNums (nums=@0x7fff5fbffad0) at main.cpp:10

(gdb) print nums[0]
$1 = (int &) @0x100103910: 2
(gdb) print copyOfNums[0]
$2 = (int &) @0x0: Cannot access memory at address 0x0
(gdb) 

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

vector<int> copyNums(vector<int> nums){
  int sizeNums = nums.size();
  vector<int> copyOfNums;

=>for (int i = 0; i < sizeNums; i++){
    copyOfNums.push_back(nums[i]);
  }

  return copyOfNums;
}

vector<int> getSmallNums(){

  vector<int> nums;
  nums.push_back(2);
  nums.push_back(1);
  nums.push_back(8);

  return nums;
}

int main (int argc, char *argv[]){
    vector<int> nums = getSmallNums();
    vector<int> copyOfNums = copyNums(nums);


    return 0;
}

这是sort返回后的gbd输出。看起来该副本包含对内存中新位置的引用,其l值为2(如预期的那样)。为什么我无法访问copyNums函数中的copyOfNums [0]?

(gdb) print nums[0]
$3 = (int &) @0x1001000e0: 2
(gdb) print copyOfNums[0]
$4 = (int &) @0x100103920: 2

编辑:这是一个更完整的调试会话图片

(gdb) info locals
i = 1
sizeNums = 3
copyOfNums = {
  <std::_Vector_base<int,std::allocator<int> >> = {
    _M_impl = {
      <std::allocator<int>> = {
        <__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
      members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
      _M_start = 0x0,
      _M_finish = 0x0,
      _M_end_of_storage = 0x0
    }
  }, <No data fields>}
(gdb) print copyOfNums[0]
$1 = (const int &) @0x0: Cannot access memory at address 0x0

2 个答案:

答案 0 :(得分:3)

我不确定编译器能够在多大程度上优化它,但实际上,这段代码:

vector<int> copyNums(vector<int> nums){
  int sizeNums = nums.size();
  vector<int> copyOfNums;

  for (int i = 0; i < sizeNums; i++){
    copyOfNums.push_back(nums[i]);
  }

  return copyOfNums;
}

与此代码具有相同的结果:

vector<int> copyNums(vector<int> nums){
  return nums;
}

如果编译器正在进行这样的优化,或者其他一些可能的优化,copyofNums可以完全优化掉。

答案 1 :(得分:0)

让我回答你的部分问题。

  

copyNums [0]包含nums [0]或指向的值的地址   它应该包含对新int的引用(与the相同)   nums [0]指向的l值?

您使用的术语(新的,参考)似乎让我感到困惑。

copyNums[0]包含num[0]值的副本&nums[0]&copyNums[0]不同。 nums[0]包含int类型的值。因此,copyNums[0]既不包含位置[0]的地址,也不包含对新int的引用。