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

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

(这里有3个相关问题)

我在 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) 如果我在 y?


2) 如果 x 是 vector 或另一个 STL 集合的对象,上述内容会改变吗?还是适用相同的规则?


3) 构造函数中的指针被分配给数据成员的类呢:

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

    private:
        Something* x;
}

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

y 是否必须在此处通过引用传递,否则会分配指针的拷贝?我问这个是因为我在这里问了另一个 SO 问题:

Pointer to pointer assignment isnt working

最佳答案

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;
}

关于c++ - 避免无意中复制对象——可用的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20020153/

相关文章:

提取运算符重载中的c++ undefined reference

c++ - 包含自己的 map

c++ - 给定指针调用括号重载

C++:成员指针已初始化?

c - 链接列表无法正常工作

c# - 如何从函数中检索输入

c++ 引用 - 是否分配了内存?

c++ - 链表数据访问

通过引用传递的 MATLAB 函数

c# - 继承类作为引用