내 응용 프로그램에서 클래스 CDbaOciNotifier의 많은 인스턴스가 있습니다. 모두 클래스 OCIEnv 클래스의 하나의 인스턴스에 대한 포인터를 공유합니다.리소스 할당 및 자동 할당 해제
는 내가 달성하고자하는 것은이 클래스 CDbaOciNotifier 내부에서 자동으로 처리됩니다 OCIEnv 자원 클래스의 할당 및 할당 취소합니다.
클래스 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과 같은 것을 사용하십시오.
내 문제는 쉽게 해결할 수 있습니까?
Caspin, 설명과 코드 예제에 감사드립니다. 나는 그것을 매우 고맙게 생각한다. – nabulke