C++:将隐式复制结构

Kar*_*ten 2 c++ struct copy pass-by-reference null-pointer

我对 C++ 比较陌生,我想知道在以下情况下是否复制了结构:

struct foo {
  int i;
  std::vector<int> bar;
}

class Foobar {
  foo m_foo;

  void store(foo& f) {
    this->m_foo = f;
  }
}

void main() {
  Foobar foobar;
  {
    foo f;
    f.i = 1;
    f.bar.insert(2);
    foobar.store(f);
  }
  // will a copy of f still exist in foobar.m_foo, or am I storing a NULL-Pointer at this point?
}
Run Code Online (Sandbox Code Playgroud)

我问这个的原因是我最初是一个 .NET 开发人员,如果你将它们传递给一个函数(而类不是),那么在 .NET 结构中将被复制。我很确定如果 store 没有被声明为通过引用获取 f ,它会被复制,但我无法更改此代码。

编辑:更新了代码,因为我不知道这vector.insert会影响我的问题。在我的情况下,我将结构存储为类中的成员,而不是向量。所以我的问题真的是:会f被复制this->m_foo = f;吗?

Roo*_*ook 5

简短的回答:是的。

长答案:你必须得到一个指向堆栈分配结构的指针,然后让该结构超出范围,以便在你的向量中得到一个悬空引用......但即便如此,你也不会存储一个NULL。C 和 C++ 指针是简单的东西,如果您的代码没有覆盖它们,那么在该内存位置变得无效之后很长一段时间内,它们仍会继续指向该内存位置。

可能还值得注意的是,std::vector有一组与之关联的复制和移动函数,在这种情况下将被隐式调用,因此bar结构内的向量也将与简单的 integer 一起复制i。标准库类往往写得很好,但其他人的代码却没有这样的保证!

现在,关于您的编辑:

class Foobar {
  foo m_foo;

 void store(foo& f) {
    this->m_foo = f;
  }
}
Run Code Online (Sandbox Code Playgroud)

你会 仍然没有与任何问题,foo存储在实例m_foo。这是因为this->m_foo = f调用复制操作,因为m_foo它不是引用或指针类型的变量。如果你有这个:foo& m_foo那么你会遇到困难,因为不是复制foo实例,而是复制对实例的引用foo,当该实例超出范围时,引用不再有效。