C++ 如何在C+中同时使用自动引用计数和虚拟函数+;?

C++ 如何在C+中同时使用自动引用计数和虚拟函数+;?,c++,garbage-collection,shared-ptr,virtual-functions,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 shar

我一直在寻找这个问题的答案很久了

我想在可能和必要的地方使用共享数据(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{
公众:
void方法(){
//这里没有内存泄漏,因为它包含
//共享ptr内数据的引用计数
OtherObject::otherMethod(this);
}
私人:
类数据{};
共享ptr数据;
};
因为如果我简单地将我的类MyObject嵌套在共享的_ptr中,我将无法以某种方法在MyObject类之外安全地传递“this”原始指针。原始指针不受引用计数的保护

例如:

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;
类MyObject{
公众:
void方法(){
//此处内存泄漏,因为它不包含
//数据或自身(MyObject)的引用计数
OtherObject::otherMethod(this);
}
私人:
类数据{};
数据;
};
...
共享对象;
crazyLeakingObject泄漏,因为它里面有MyObject及其所有数据和方法,但它只是MyObject,并没有任何关于引用计数的信息。在MyObject的方法中,我们没有这样的信息

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

有没有办法使用虚拟函数和自动引用计数?我在哪里可以找到一个例子?你面对过这个问题吗

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

提前感谢。

您可以将虚拟函数与
共享\u 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
struct Base{
虚拟~Base(){}

void foo(){std::cout您想使用std::enable_shared_from_this传递共享对象的this指针


我必须承认,对于您试图实现的目标,我完全感到困惑。不管怎样,您提供的代码没有内存泄漏。
shared_ptr crazyLeakingObject;
没有泄漏任何内容。它甚至没有创建
MyObject
的实例,只是一个空的共享\u ptr。我认为您需要显示更多的代码,举个例子这个问题完全是一团糟。我建议你坐下来几分钟,重新考虑一下真正困扰你的问题,然后写一个更简单的问题。有些事情还不清楚:标题提到了虚拟函数,但整个问题中没有提到其他内容。不清楚是什么
otherMethod是,参数应该是什么和/或预期的行为是什么(重要的部分是它是否只使用参数,或者它是否还可以存储参数以供以后使用,比如在成员变量中).crazyLeakingObject本身并没有泄漏,你能解释一下你的意思吗?使用
shared_ptr
的一个理由是你不能复制,因为对象是多态的。关于从
这个
生成新指针,我发现
boost::invisive_ptr
在这里非常有效。这将ULD编译得更好:-谢谢,我会尝试使用Enable SysDyfRoxx。这是我尝试写的。不介意它可以在C++ STD中。