我一直在寻找这个问题的答案。
我想在可能和必要的地方使用共享数据(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_ptr
至 otherMethod
而不是原始指针,并使用 Boost 的 enable_shared_from_this
这样 method
中的代码可以获得指向对象本身的共享指针,传递给otherMethod
.但是没有看到任何相关代码,我不知道是否有必要或一个好主意。
关于c++ - C++中如何同时使用自动引用计数和虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230819/