0

我一直在寻找这个问题的答案很长时间。

我想在可能和必要的地方使用共享数据(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。但是原始指针和受保护的共享指针是相反的。这两种方法一起使用会使我的项目架构变得混乱。第二种方法存在漏洞。

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

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

提前致谢。

4

2 回答 2

1

您想使用 std::enable_shared_from_this 来传递共享对象的 this 指针...

http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/enable_shared_from_this

于 2012-06-27T17:21:27.197 回答
1

可以使用虚函数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_ptrtootherMethod而不是原始指针,并使用 Boostenable_shared_from_this以便代码中的代码method可以获取指向对象本身的共享指针,以传递 to otherMethod。但是没有看到任何相关代码,我不知道它是否有必要或一个好主意。

于 2012-06-27T16:33:36.713 回答