Ada调用C++工厂方法库:实例提前销毁问题咨询
问题原因解析
- Ada对C++对象的默认所有权逻辑:当Ada绑定C对象接口时,如果没有显式定义销毁原语(
Delete_Item和Delete_And_Free_Item),Ada会默认认为自己拥有该对象的所有权,会在Ada作用域结束时自动触发对象销毁。但这个默认销毁逻辑不符合C对象的析构规则,要么提前释放了内存,要么没正确调用C++析构函数,直接导致ConcreteItem实例在configured_item.do_something()执行前就被销毁。 - 显式销毁原语的作用:在
Item_h.ads中声明这两个销毁原语,相当于告诉Ada:该C对象的生命周期由外部(C工厂或用户代码)负责管理,Ada不会自动销毁它。这样ConcreteItem实例能保持存活直到do_something()调用完成,之后再由C++侧或显式调用销毁原语释放资源。 - Factory模式的所有权边界冲突:Factory Method模式中,C++工厂创建的对象通常由工厂或用户负责销毁。Ada适配器层如果没有声明销毁接口,会错误接管所有权,打破原有生命周期约定,引发对象提前销毁的问题。
内容的提问来源于stack exchange,提问作者Albatros23
相关产品推荐
相关产品推荐

