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