【发布时间】:2015-08-25 12:53:44
【问题描述】:
我正在设计一个创建不同类型 Foo 的工厂,并且我正在尝试使用智能指针。
大多数似乎运行良好,但由于编译器限制,我缺少一些重要功能(即nullptr)。
我有这个方法:
std::unique_ptr<Foo> createFoo(const std::string &fooType) {
auto it = _registeredFoo.find(fooType); // _registeredFoo is a map
if(it != _registeredFoo.end())
return std::unique_ptr<Foo>(it->second());
return std::unique_ptr<Foo>(NULL);
}
当我测试这个方法时,它从不返回类似NULL 的指针。
这就是我测试我的方法的方式。
std::unique_ptr<Foo> _foo = FooFactory::getInstance()->createFoo("FOO"); //FOO is registered
if(_foo) {
std::cout << "Hello, World!" << std::endl;
} else {
std::cout << "Goodbye, World!" << std::endl;
}
std::unique_ptr<Foo> _bar = FooFactory::getInstance()->createFoo("BAR"); // BAR is unregisered
if(_bar) {
std::cout << "Hello, World!" << std::endl;
} else {
std::cout << "Goodbye, World!" << std::endl;
}
我总是看到“Hello, World!”
这让我相信我对std::unique_ptr 的构造函数的使用有点滥用。谁能给我一个建议,告诉我如何在没有emulating nullptr myself 的情况下解决这个问题?
我使用的是 gcc 4.4.6。
【问题讨论】:
-
不会简单地使用
unique_ptr();帮助吗? -
其实和default constructor是一样的。你如何检查你的代码“从不返回
NULL-like指针”? -
“当我测试这个方法时,它从不返回类似 NULL 的指针。” 这是你问题中唯一真正的问题,但它缺乏细节.你能更好地解释你的问题吗?
-
GCC 4.4.6 已经过时了。当它说“C++0x 支持是实验性的”时,它是真的。如果可能,请升级。你生活在边缘。
-
呃,您知道您的代码可能会导致双重释放和/或内存泄漏,尤其是当您让
unique_ptr正常工作时?您将指向内存的所有权从注册表传递给您返回的unique_ptr。unique_ptr将调用delete,您的注册表可能会调用delete。如果您使用相同的参数调用createFoo两次,也会出现同样的问题。