【发布时间】:2010-05-25 12:40:31
【问题描述】:
在我的应用程序中,我得到了许多 class CDbaOciNotifier 实例。它们都共享一个指向 class OCIEnv 实例的指针。
我想要实现的是资源 class OCIEnv 的分配和释放将在 class CDbaOciNotifier 内自动处理。
期望的行为是,使用 class CDbaOciNotifier 的第一个实例将创建环境,之后所有后续通知器都使用相同的环境。随着最后一个通知器的销毁,环境也将被销毁(调用自定义删除器)。 稍后,这个循环可以通过创建新环境重新开始。
到目前为止我得到了什么(使用静态工厂方法创建通知器):
#pragma once
#include <string>
#include <memory>
#include "boost\noncopyable.hpp"
class CDbaOciNotifier : private boost::noncopyable
{
public:
virtual ~CDbaOciNotifier(void);
static std::auto_ptr<CDbaOciNotifier> createNotifier(const std::string &tnsName, const std::string &user, const std::string &password);
private:
CDbaOciNotifier(OCIEnv* envhp);
// All notifiers share one environment
static OCIEnv* m_ENVHP;
// Custom deleter
static void freeEnvironment(OCIEnv *env);
OCIEnv* m_envhp;
};
CPP:
#include "DbaOciNotifier.h"
using namespace std;
OCIEnv* CDbaOciNotifier::m_ENVHP = 0;
CDbaOciNotifier::~CDbaOciNotifier(void)
{
}
CDbaOciNotifier::CDbaOciNotifier(OCIEnv* envhp)
:m_envhp(envhp)
{
}
void CDbaOciNotifier::freeEnvironment(OCIEnv *env)
{
OCIHandleFree((dvoid *) env, (ub4) OCI_HTYPE_ENV);
*env = null;
}
auto_ptr<CDbaOciNotifier> CDbaOciNotifier::createNotifier(const string &tnsName, const string &user, const string &password)
{
if(!m_ENVHP)
{
OCIEnvCreate( (OCIEnv **) &m_ENVHP, OCI_EVENTS|OCI_OBJECT, (dvoid *)0,
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0,
(size_t) 0, (dvoid **) 0 );
}
//shared_ptr<OCIEnv> spEnvhp(m_ENVHP, freeEnvironment); ...got so far...
return auto_ptr<CDbaOciNotifier>(new CDbaOciNotifier(m_ENVHP));
}
我想避免自己计算引用(通知器),并使用 shared_ptr 之类的东西。
您认为我的问题有一个简单的解决方案吗?
【问题讨论】:
标签: c++