指针和抽象类
Pointer and Abstract class
struct Abstract{
virtual void methodA() = 0;
};
struct Test : public Abstract{
virtual void methodA(){
printf("Test message");
}
};
class Foo{
Abstract* abs; //I made it this way so that an instance of Foo
//can easily switch between any class that implements
//Abstract
public:
virtual ~Foo(){
delete abs; //free abs
}
void setAbs(Abstract* a){
abs = a; //is there any other way to do this?
}
void changeAbs()//method to switch abs
void show(){
abs->methodA();
}
};
int main(){
Test *test = new Test();
// Test test; //local instantiation will throw a segmentation fault
//because abs is freed in the desctructor of Foo
Foo foo;
foo.setAbs(test);
foo.show();
// delete test; //using a pointer is fine unless freed
return 0;
}
我担心的是:
如果我不释放析构函数中的abs,并且用户忘记释放实现Abstract的对象,或者如果用户这样做
setAbs(new Test())
,就会发生泄漏。如果我在析构函数中释放abs,如果用户在本地实例化Test,或者他使用指针并最终自己删除它,它将抛出分段错误。
Abstract abs
也是不允许的,因为它是一个抽象类
我想把setAbs((改成这样:
void setAbs(Abstract* a){
abs = new Abstract(*a); //but copying like a normal class doesn't work on abstract classes
}
我的问题是,有没有其他方法可以实现setAbs((,从而使参数的副本通过?
如果没有其他方法,我就让释放成为用户的工作。
这里的根本问题是您没有明确谁拥有这个内存。
如果你的类拥有它,那么在析构函数中释放它是安全的。不是你写的那样,而是理论上的。阅读《三条规则》。
如果你的类不拥有指针,那么,好吧,不要解除分配。解除分配不是你的,所以使用它,不要再做任何事情。
处理内存的安全方法是隐式地强制执行一个关于谁对什么负责的契约。如果用户继续并且delete
是你的指针,那么,告诉他们停止;这不关他们的事。您可以使用std::unique_ptr
指针和get()
函数来执行同样的操作。这堂课不会阻止你,怎么可能呢?它不在乎你是否开枪自杀。RTFM。
说到std::unique_ptr
。。。你为什么不使用它(或者std::shared_ptr
,如果合适的话(?这是一个已解决的问题,无需在这里提出自己的解决方案。
相关文章:
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 删除指向抽象类的指针向量
- 如何将抽象类指针作为Q_PROPERTY?
- 为什么我可以取消引用指向抽象类的指针?
- 指向抽象类的指针数组:指向 nullptr 或不指向 nullptr (C++)
- C++ abort() 在函数内的抽象类对象指针调用上
- 抽象类和独特的指针
- 如何使用抽象类指针避免内存泄漏
- 如何从抽象类中删除指针
- 指向模板抽象类的指针向量
- 指针到抽象类的功能超载
- 使用抽象类时,如何正确删除指针
- 抽象类和唯一指针 c++ 错误
- 尝试在映射C++中存储指向抽象类的指针
- C++中的抽象类指针
- 如何将子类分配给函数中的抽象类指针
- 带有抽象类指针的c++对象副本
- 如何在c++中实现与抽象类指针向量的缓存一致性
- C++访问抽象类指针向量的子类的成员