2012-07-12 3 views
1

sqlite 용 약간의 래퍼 클래스를 만들고 있습니다. 데이터를 데이터베이스에서 가져 오려면 SQLiteValue라는 클래스가 있습니다. 쿼리에 대한 데이터 바인딩시 SQLiteValue 인스턴스는 스택에서 만들어지고 몇 가지 함수를 통해 전달됩니다. 클래스의 기본 골격은 아래와 같습니다.C++ 소멸자가 여러 번 호출 됨

class SQLiteValue : public SQLiteObject 
{ 
private:    
    // stores a pointer to the data contained (could be of varying types) 
    union 
    { 
     int* i; 
     double* d; 
     std::string* s; 
     std::wstring* ws; 
     BYTE* b; 
    } pdata; 
      int type; 



public: 

    SQLiteValue(const char* val); 
    SQLiteValue(const wchar_t* val); 
    .. and so on for varying types 
    virtual ~SQLiteValue(); 
}; 

개체가 여러 개의 오버로드 된 생성자 중 하나에 의해 만들어집니다. 생성자는 유형에 따라 pdata의 "멤버"를 인스턴스화합니다. 이것이이 수업에서 중요한 것입니다. 자, 문제. 깨끗한 메서드 호출을 얻고 SQLiteValue (xxx)를 명시 적으로 호출 할 필요가 없도록 생성자가 오버로드되었습니다. 따라서 필자는 함수에 대한 참조를 사용하고 싶지 않으므로이를 정의합니다. 이 때마다 인스턴스화 할 수있는 새로운 개체 발생과 같은

void BindValue(const char* name, SQLiteValue value) 
query->BindValue(":username", "user2"); // the "clean" method call 

을 선언 (또는 비슷한?) 나는 함수를 호출 그래서 소멸자 PDATA에 할당 된 메모리를 해제합니다. 이것은 나쁘다.

내가 알고 싶은 것은 이것입니다. 내 깨끗한 메서드 호출을 유지하면서 노력하고있는 것을 성취 할 수있는 더 좋은 방법이 있습니까? 현재 문제를 해결하는 참조로 작동하는 개인 기능이 있지만이 방법이 맘에 들지 않습니다. 레퍼런스를 잊어 버리는 것은 쉬울 것이고 나는이 동일한 문제를 다시 추적하게 될 것입니다.

감사합니다.

+2

글쎄, 그것은 그것은' "사용자 2"'에서 임시을 만들 것이다, 그래서 값에 의해 전달하고 BindValue''에 사용되는 값 ''에 복사합니다. 그런 다음 소멸자는 함수의 끝에서'query -> ... '후에 호출됩니다. –

답변

0

const 참조로 매개 변수를 가져 오도록 BindValue를 변경하십시오.

void BindValue(const char* name, const SQLiteValue &value) 
+0

Ahh .. 그래, 그럴거야. 그것. 감사 – user1520427

0

rvalue 참조가 도움이 될 수있는 상황입니다. 호출 된 생성자/소멸자의 양을 줄이지 않지만 rvalue (& &) 복사 생성자 또는 연산자에 임시 클래스 인스턴스의 내부 리소스를 "도용"할 수 있습니다. 여기에서 자세한 내용을 참조하십시오 http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

를 rvalue 참조 복사 생성자 그냥 대신 할당, 복사 및 해제, 그래서 0으로 다른 인스턴스 자원을 "이"인스턴스에 다른 인스턴스 내부 자원을 이동하고, 재설정, 그것을 단지 복사 포인터 또는 처리 . 코드에서 "user2"는 임시 인스턴스 - 값 참조입니다.

이것은 C++ 0x 표준을 구현하는 모든 C++ 컴파일러에 적용 할 수 있습니다.

+0

링크를 제공해 주셔서 감사합니다. 불행히도 저는 현재 C++ 0x를 사용하지 않고 있지만 알고 있습니다. :) – user1520427

+0

""이것은 C++ 0x 표준을 구현하는 모든 C++ 컴파일러에 적용 할 수 있습니다. "" –

관련 문제