我一直在寻找这个问题的答案很长时间。
我想在可能和必要的地方使用共享数据(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。但是原始指针和受保护的共享指针是相反的。这两种方法一起使用会使我的项目架构变得混乱。第二种方法存在漏洞。
有没有办法使用虚函数和自动引用计数?我在哪里可以找到示例?你遇到过问题吗?
我不是以英语为母语的人,所以您可以要求澄清。
提前致谢。