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();
};
该对象由几个重载构造函数之一创建。构造函数根据其类型实例化updatea的"成员"。这对这个班来说很重要。现在,问题来了。我重载了构造函数,所以我得到了干净的方法调用,不需要显式调用SQLiteValue(xxx)。因此,我并不真的想对函数使用引用,所以我这样定义它们。
void BindValue(const char* name, SQLiteValue value)
query->BindValue(":username", "user2"); // the "clean" method call
像这样声明它们会导致每次调用函数时(或者类似的事情?)都实例化一个新对象,因此析构函数会释放为updatea分配的内存。这太糟糕了。
我想知道的是这个。有没有更好的方法来实现我想要做的事情,同时保留干净的方法调用?目前,我有通过引用操作的私有函数,这解决了问题,但我真的不喜欢这种方法。我很容易忘记参考资料,我最终会再次追踪到同样的问题。
谢谢。
更改BindValue以通过const引用获取参数。
void BindValue(const char* name, const SQLiteValue &value)
在这种情况下,右值引用会有所帮助。它不会减少调用的构造函数/析构函数的数量,但允许在右值(&&)复制构造函数或运算符=中"窃取"临时类实例的内部资源。请在此处查看详细信息:http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx
rvalue引用复制构造函数只是将另一个实例内部资源移动到"this"实例,并将另一实例资源重置为0。因此,它只是复制一个指针或句柄,而不是分配、复制和释放。代码中的"user2"就是这样一个临时实例值引用。
这可以应用于任何实现C++0x标准的C++编译器。
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常