多次调用 C++ 析构函数

标签 c++ object reference stack destructor

我正在为 sqlite 制作一个小包装类。为了从数据库中获取数据,我有一个名为 SQLiteValue 的类。当为查询绑定(bind)数据时,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 的内存。这很糟糕。

我想知道的是这个。有没有更好的方法来实现我正在尝试做的事情,同时保留我的干净方法调用?目前我有通过引用操作的私有(private)函数解决了这个问题,但我不太喜欢这种方法。我很容易忘记引用,我最终会再次追踪同样的问题。

谢谢。

最佳答案

更改 BindValue 以通过 const 引用获取参数。

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

关于多次调用 C++ 析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11450084/

相关文章:

c++ - 为什么数组的 x 和 &x 相同

c++ - 将否定的 double 转换为 int

c++ - 二叉搜索树

arrays - 如何在swift 3中按自定义状态值对自定义对象数组进行排序?

javascript - 比较两个数组对象数据并作为一个对象合并到 javascript 中的数组中?

java - Java 是否有办法将变量名称分配给 Scanner 类中的新对象?

java - 什么时候可以使用 "=="运算符?

c++ - 模板参数是如何展开的

c++ - 是否还可以自定义STL vector 的 "reference"类型?

rust - 获取对 Vec 元素的可变引用或创建新元素并获取该引用