c++ - C++中如何同时使用自动引用计数和虚函数?

标签 c++ garbage-collection shared-ptr virtual-functions

我一直在寻找这个问题的答案。

我想在可能和必要的地方使用共享数据(shared_ptr 或类似的东西)。但我也想使用虚函数。正如您在下面看到的,将它们一起使用存在矛盾。

我以这种方式保护类的数据:

class MyObject {
public:
    void method() {
        // no memory leak here, because this contains
        // count of references of Data inside shared_ptr
        OtherObject::otherMethod(this);
    }
private:
    class Data {};
    shared_ptr<Data> data;
};

因为如果我简单地将我的类 MyObject 嵌套在 shared_ptr 中,我将无法在某些方法中将“this”原始指针安全地传递到 MyObject 类之外。原始指针不受引用计数保护。

例子:

class MyObject {
public:
    void method() {
        // memory leak here, because this does not contain
        // count of references of Data or of self (MyObject) 
        OtherObject::otherMethod(this);
    }
private:
    class Data {};
    Data data;
};

...

shared_ptr<MyObject> crazyLeakingObject;

crazyLeakingObject 泄漏,因为它内部有 MyObject 及其所有数据和方法,但它只是 MyObject,没有任何关于引用计数的信息。在 MyObject 的方法中我们没有这样的信息。

当我不需要虚函数时,我使用的第一种方法。但第二个是虚函数。如您所知,您只能通过现有对象的指针(原始指针)访问 vtable。但是原始指针和 protected 共享指针是相反的。 同时使用这两种方法会使我的项目架构变得困惑。 第二种方法存在漏洞。

有没有办法使用虚函数和自动引用计数?我在哪里可以找到示例?您遇到过问题吗?

我的母语不是英语,所以您可以要求澄清。

提前致谢。

最佳答案

可以将虚函数与shared_ptr一起使用:

struct Base {
    virtual ~Base() {}
    void foo() { std::cout << "base\n"; }
};

struct Derived : Base {
    void foo() { std::cout << "derived\n"; }
};

int main() {
    shared_ptr<Base> ptr(new Derived());
    ptr->foo(); // prints "derived"
} // object is deleted at function return

如果您的 OtherObject::otherMethod将它的参数存储在某个地方,这样它可以比调用者的引用持续更长时间,那么你可能会遇到问题。你可以传递 shared_ptrotherMethod而不是原始指针,并使用 Boost 的 enable_shared_from_this这样 method 中的代码可以获得指向对象本身的共享指针,传递给otherMethod .但是没有看到任何相关代码,我不知道是否有必要或一个好主意。

关于c++ - C++中如何同时使用自动引用计数和虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230819/

相关文章:

c++ - std::string 可以包含嵌入的空值吗?

c++ - 递归二叉树的高度

c++ - 如何开始使用多线程编程?

c++ - 十进制转二进制C++

.net - vb.net 中的多个 "= new"具有相同的变量。垃圾收集会处理吗?如何处理?

java - 对象引用、线程和垃圾收集

c++ - shared_ptr 原子函数采用指针而不是引用的基本原理

javascript - 非附加 Image.onload 垃圾回收

c++ - 如何结合使用 std::bind 和 std::shared_ptr

C++ std::shared_ptr 用法和信息