【发布时间】:2014-09-24 22:24:50
【问题描述】:
当使用工厂创建对象时,例如在下面的示例中,在某些情况下,shared_ptr 包裹的对象在返回过程中显然会被删除(在调试过程中对象创建正常但分配时到this->xs 抛出异常)。当我将工厂方法更改为返回原始指针并将Link::xs 成员更改为unique_ptr 时,代码运行良好。 shared_ptr 的底层发生了什么导致它以这种方式运行?这与shared_ptr<CrossSection> 包装Circular 对象的事实有关吗?已使用 MS Visual C++ 2012 完成测试。
class Link
{
private:
std::shared_ptr<xs::CrossSection> xs;
public:
void parseXsection(const std::vector<std::string>& parts);
std::shared_ptr<xs::CrossSection> getXs() { return this->xs; }
};
void Link::parseXsection(const std::vector<std::string>& parts)
{
this->xs = xs::Factory::create(parts[1]);
}
namespace xs
{
class CrossSection
{
};
class Circular : public CrossSection
{
};
class Dummy : public CrossSection
{
};
class Factory
{
public:
static std::shared_ptr<CrossSection> create(const std::string& type);
};
std::shared_ptr<CrossSection> Factory::create(const std::string& type)
{
if (geom == "circular")
{
return std::shared_ptr<CrossSection>(new Circular());
}
else
{
return std::shared_ptr<CrossSection>(new Dummy());
}
}
}
【问题讨论】:
-
您的代码具有未定义的行为,因为
Factory::create在必须返回shared_ptr时可能不会返回任何内容。你应该先解决这个问题。 -
我添加了更多代码来解决这个问题,但在我的实际实现中已经处理好了。
-
我确信这只是为了简单起见,但总的来说,使用枚举类型和
switch语句来做类似的事情可能是一个更好的主意。它比进行字符串比较更有效,并且您可以在一个地方修改所有比较选项。
标签: c++ visual-c++ polymorphism shared-ptr