1

私は2std::vector秒持っています:

  • 最初のベクトルに、インスタンスを配置します
  • 2番目のベクトルに、配置したばかりのインスタンスのアドレスを格納したい

しかし、それは機能しません。つまり、格納されたアドレスは、配置されたインスタンスのアドレスとは異なります。

それが問題である場合、私は Linux を使用しており、g++ 5.1 と -std=c++11 を指定して clang 3.6 を使用しています。

問題を説明するための実際の例を次に示します。

#include <iostream>
#include <vector>

struct Foo {
  Foo(int a1, int a2) : f1(a1), f2(a2) {}

  int f1;
  int f2;
};

int main(int, char**) {
  std::vector<Foo> vec1;
  std::vector<Foo*> vec2;

  int num = 10;
  for (int i = 0; i < num; ++i) {
    vec1.emplace_back(i, i * i);

    // I want to store the address of *emplaced* instance...
    vec2.push_back(&vec1.back());
  }

  // same
  std::cout << "size 1: " << vec1.size() << std::endl;
  std::cout << "size 2: " << vec2.size() << std::endl;
  // same for me
  std::cout << "back 1: " << &vec1.back() << std::endl;
  std::cout << "back 2: " << vec2.back() << std::endl;
  // typically differ ?
  std::cout << "front 1: " << &vec1.front() << std::endl;
  std::cout << "front 2: " << vec2.front() << std::endl;

  for (int i = 0; i < num; ++i) {
    std::cout << i + 1 << "th" << std::endl;
    // same for last several (size % 4) for me
    std::cout << "1: " << &vec1[i] << std::endl;
    std::cout << "2: " << vec2[i] << std::endl;
  }
}

質問

  • それは正しい動作ですか?一時インスタンスのアドレスを保存していることが原因だと思いますが、標準で許可されているかどうかを知りたいです(ただ興味があります)。
  • 上記が当てはまる場合、これを回避するにはどうすればよいですか? 最初のものを に変更することでこれを解決しましvector<unique_ptr<Foo>>たが、慣用的な方法はありますか?
4

1 に答える 1