Use std::unique_ptr for CZMQNotifierFactory.

Instead of returning a raw pointer from CZMQNotifierFactory and
implicitly requiring the caller to know that it has to take ownership,
return a std::unique_ptr to make this explicit.

This also changes the typedef for CZMQNotifierFactory to use the new
C++11 using syntax, which makes it (a little) less cryptic.
This commit is contained in:
Daniel Kraft 2018-07-17 12:36:22 +02:00
parent b93b9d5456
commit 7f2ad1b9ac
2 changed files with 11 additions and 7 deletions

View file

@ -7,10 +7,14 @@
#include <zmq/zmqconfig.h>
#include <util/memory.h>
#include <memory>
class CBlockIndex;
class CZMQAbstractNotifier;
typedef CZMQAbstractNotifier* (*CZMQNotifierFactory)();
using CZMQNotifierFactory = std::unique_ptr<CZMQAbstractNotifier> (*)();
class CZMQAbstractNotifier
{
@ -21,9 +25,9 @@ public:
virtual ~CZMQAbstractNotifier();
template <typename T>
static CZMQAbstractNotifier* Create()
static std::unique_ptr<CZMQAbstractNotifier> Create()
{
return new T();
return MakeUnique<T>();
}
std::string GetType() const { return type; }

View file

@ -45,13 +45,13 @@ CZMQNotificationInterface* CZMQNotificationInterface::Create()
std::string arg("-zmq" + entry.first);
if (gArgs.IsArgSet(arg))
{
CZMQNotifierFactory factory = entry.second;
std::string address = gArgs.GetArg(arg, "");
CZMQAbstractNotifier *notifier = factory();
const auto& factory = entry.second;
const std::string address = gArgs.GetArg(arg, "");
std::unique_ptr<CZMQAbstractNotifier> notifier = factory();
notifier->SetType(entry.first);
notifier->SetAddress(address);
notifier->SetOutboundMessageHighWaterMark(static_cast<int>(gArgs.GetArg(arg + "hwm", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM)));
notifiers.emplace_back(notifier);
notifiers.push_back(std::move(notifier));
}
}