【发布时间】:2016-08-09 16:40:44
【问题描述】:
我有一个Base 类,有两个派生类DerivedA 和DerivedB 以及一个返回指针Base* 的工厂方法。
Base* GetClass(int choice)
{
if (choice == 0)
return new DerivedA();
else if (choice == 1)
return new DerivedB();
throw std::invalid_argument("no no no");
}
DerivedA 和 DerivedB 都实现了一个方法,比如 GetDouble(),而这个方法是我对构建这些类中的任何一个感兴趣的唯一事情:
double d = GetClass(0)->GetDouble();
我的问题是:当我调用 GetClass(0) 时,我创建了一个应该删除的指针。但是,我没有将它实例化为对象。我还需要删除它吗?
类似:
Base* c = GetClass(0);
double d = c->GetDouble();
delete c;
这将如何与std::unique_ptr 一起使用?
提前谢谢你。
【问题讨论】:
-
“我没有将它实例化为对象”是什么意思。?当然,您正在泄漏内存(或其他资源)。
-
返回一个
std::unique_ptr<Base>,你就不会考虑删除它;-) -
我的意思是作为我给出的最后一个例子,当我首先将一个类实例化为
Base* c,然后调用c->GetDouble(),然后删除c -
@Girardi:“实例化”是您对模板所做的事情。最后一个示例的 C++ 描述将是“初始化变量
Base *c”。 -
@MSalters 感谢您的信息 =)