2

我有一个类,DevicePointer它封装了一个std::shared_ptr<Device>. 需要保存指向设备的指针的各种类派生自DevicePointer. 在我开始使用之前shared_ptrDevicePointer有一个::Expose()函数可以返回一个指向设备的原始指针。现在我使用 shared_ptr 来保存设备指针,我不知道如何返回它。请注意,::Expose应该调用的唯一原因是取消引用指针。

这是原始 Expose 的样子:

Device * Expose() const  { return MyDevice; }

并且会像这样使用:

Device::Expose()->ExecuteFunction(a, b, c);

现在MyDevice是一个std::shared_ptr<Device>,我不知道如何返回它以解除引用。显而易见的选择是:

std::shared_ptr<Device> Expose() {
    return MyDevice;
}

但我担心性能,特别是创建一个新的临时std::shared_ptr. 所以我需要某种方式说“你可以取消引用这个指针,但你不能复制它”。原始的仍然需要共享,因为许多对象将持有对它的引用。

我希望我已经充分表达了我的问题。谢谢。

4

3 回答 3

2

这不会影响性能

Device & Expose() {
    return *MyDevice.get();
}

编辑:

要使对象不可复制:

class Device
{

private:
    //compiler will throw errors when copy constructor or = is called in the code
    Device(const Device &)
    {}
    void operator = (const Device &)
    {
    }
};

编辑(2018-09-05):

从 c++11 开始,您可以显式删除复制构造函数或赋值运算符:

class Device
{
public:
    Device(const Device &) = delete;
    Device& operator = (const Device &) = delete;
};
于 2013-11-05T17:16:32.050 回答
1

(编辑:这里的第一段指的是你原来的问题,你在哪里取消引用函数中的指针,并返回一个引用。)

像这样取消引用指针似乎不太安全,因为它使调用者有责任在无法看到指针的情况下确定操作的安全性。如果指针为空,就会出错。

因此,我建议只返回一份shared_ptr. 除非您每秒调用数百次,否则性能影响应该不会很大。

不幸的是,没有办法防止复制。无论您返回指针还是引用,调用者都可以轻松获取副本。

于 2013-11-05T17:21:57.640 回答
1

如果您的应用程序是多线程的,并且您的对象可以随时以异步方式“销毁”,那么除了返回 shared_ptr 副本之外别无选择。如果您确定对象的生命周期,则可以返回对 shared_ptr 的引用。但这可能会在您的代码升级后成为麻烦。取消引用指针 (shared_ptr::get) 也是如此,因为将来当代码变得更加复杂并且对象的生命周期变得难以跟踪时,将很难支持该代码。

于 2013-11-05T17:24:35.197 回答