4

gdb デバッガーの使用方法を学んでいますが、ベクターに別のベクターからコピーされた値が含まれている場合、そのベクターの値にアクセスするのに問題があります。最終的に、以下のプログラムは私がやりたいことを実行します (「nums」の値を新しいベクター「copyOfNums」にコピーします) が、「copyNums」で最初の for ループを実行した後に copyOfNums[0] の値を調べようとすると"、メモリ内の値にアクセスできません (以下の gdb セッションを参照してください)。

以下の copy nums は for ステートメントの 1 ループを実行したため、copyNums[0] には nums[0] が指す値のアドレスが含まれているか、新しい int への参照が含まれている必要があります (つまり、l- nums[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 の出力を次に示します。コピーには、メモリ内の新しい場所への参照が含まれているように見えます。その左辺値は (予想どおり) 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
4

2 に答える 2

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完全に最適化することができます。

于 2013-02-11T19:16:28.767 に答える
0

あなたの質問の一部にお答えしましょう。

copyNums[0] には nums[0] が指す値のアドレスが含まれていますか、それとも新しい int への参照を含むべきですか (つまり、nums[0] が指す左辺値と同じです)?

あなたが使用した用語 ( new, reference ) は、私には紛らわしいようです。

copyNums[0]の値のコピーが含まれていますnum[0]&nums[0]とは異なり&copyNums[0]ます。タイプnums[0]の値が含まれますint。したがって、copyNums[0]場所 nums[0] のアドレスも、新しい int への参照も含まれていません。

于 2013-02-11T19:30:32.393 に答える