簡體   English   中英

多次調用C ++析構函數

[英]C++ Destructor Called Multiple Times

我正在為sqlite做一些包裝類。 為了從數據庫獲取數據,我有一個名為SQLiteValue的類。 綁定查詢數據時,將在堆棧上創建SQLiteValue實例並傳遞一些函數。 該課程的概要如下。

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分配的內存。 這不好。

我想知道的是這個。 在保留我干凈的方法調用的同時,是否有更好的方法來實現我要執行的操作? 目前,我有通過引用操作的私有函數可以解決此問題,但是我不太喜歡這種方法。 我很容易忘記參考文獻,而最終我又再次找到了這個問題。

謝謝。

這是右值引用可以提供幫助的情況。 它不會減少調用的構造函數/析構函數的數量,但可以“竊取” rvalue(&&)復制構造函數或operator =中的臨時類實例的內部資源。 在此處查看詳細信息: http : //blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

右值引用副本構造函數只是將另一個實例內部資源移動到“此”實例,並將另一個實例資源重置為0。因此,它只是分配指針或句柄,而不是分配,復制和釋放。 您的代碼中的“ user2”就是這樣的臨時實例-右值引用。

這可以應用於實現C ++ 0x標准的任何C ++編譯器。

更改BindValue以通過const引用獲取參數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM