gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:34:54 24 4
gpt4 key购买 nike

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

我想在可能和必要的地方使用共享数据(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com