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;吗?
简短的回答:是的。
长答案:你必须得到一个指向堆栈分配结构的指针,然后让该结构超出范围,以便在你的向量中得到一个悬空引用......但即便如此,你也不会存储一个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,当该实例超出范围时,引用不再有效。
| 归档时间: |
|
| 查看次数: |
4338 次 |
| 最近记录: |