避免无意中复制对象 - 可用的技术

时间:2013-11-16 15:27:45

标签: c++ pointers pass-by-reference shared-ptr pass-by-pointer

(这里有三个相关问题)

我在C ++中遇到的最糟糕的事情之一是偶然传递/复制一个对象,然后想知道为什么它的状态不是你所期望的。我最近有一个情况,我通过指针传递,但我没有得到我期望的状态,结果我不得不通过引用传递指针,这真的把我扔了!

鉴于这种情况,我能否确认一下:

MyClass x;
AnotherClass y;
y.passMyObjectSomewhere(x);
.
.
.
.
//Later on x is changed and I wish to see this change in y
x.modifyMyObject();

我可以使用以下技术在x中更新y状态:

MyClass* x = new MyClass();
y.passMyObjectSomewhere(x);
.
.
.
delete x;

MyClass x;
y.passMyObjectSomewhere(&x);

shared_ptr<MyClass> x(new MyClass());
y.passMyObjectSomewhere(x);

1)如果我在x之外对y进行了更改,那么上述所有备选方案都会在x对象中保持y更新?


2)如果x是向量或另一个STL集合的对象,上述情况是否会发生变化?或者适用相同的规则吗?


3)将构造函数中的指针分配给数据成员的类如何:

class X{
    public:
        X(Something* x);

    private:
        Something* x;
}

X::X(Something* &y){
    x = y;
}

这里是否必须通过引用传入y因为否则将分配指针的副本?我问这是因为我在这里问了另一个问题:

Pointer to pointer assignment isnt working

1 个答案:

答案 0 :(得分:1)

1)是的,如果您存储指向x的指针,它们应该是。但是在你的前两个例子中要小心,y似乎能够比x更长久。 y中的指针将不知道指向的对象将被删除,这肯定会导致崩溃:

MyClass* x = new MyClass();
y.passMyObjectSomewhere(x);
.
// update x
y.doesSomeActionOnX(); // no crash
delete x;
y.doesSomeActionOnX(); // crash

std::shared_ptr是一个更好的选择,因为它确实处理所有权共享。顺便说一句,你可以这样做:

auto x = std::make_shared<MyClass>();

2)各处都有相同的规则。

3)你的参考在这里完全没用。

X::X(Something* y)
{ 
  this.y = y;
}