C++ C+中的析构函数+;
我用一个名为cmysqldb的类创建了一个头文件,该类包含很多指针。 我现在的问题是: 如何创建一个析构函数来删除可能导致内存泄漏的指针 以下是标题代码:C++ C+中的析构函数+;,c++,pointers,destructor,C++,Pointers,Destructor,我用一个名为cmysqldb的类创建了一个头文件,该类包含很多指针。 我现在的问题是: 如何创建一个析构函数来删除可能导致内存泄漏的指针 以下是标题代码: #ifndef CMSYQLDB_H #define CMSYQLDB_H #include <QMultiMap> #include <QStringList> #include "mysql.h" class cmysqldb { public: cmysqldb::~cmysqldb() {
#ifndef CMSYQLDB_H
#define CMSYQLDB_H
#include <QMultiMap>
#include <QStringList>
#include "mysql.h"
class cmysqldb
{
public:
cmysqldb::~cmysqldb()
{
const char *text,
MYSQL *connection,
MYSQL_RES *result,
MYSQL_RES *fresult,
MYSQL_FIELD *mfield
}
int query_state;
int numfields;
MYSQL mysql;
MYSQL_ROW row;
MYSQL_ROW fieldrow;
....
};
#endif // CMSYQLDB_H
\ifndef CMSYQLDB\u H
#定义CMSYQLDB_H
#包括
#包括
#包括“mysql.h”
类cmysqldb
{
公众:
cmysqldb::~cmysqldb()
{
常量字符*文本,
MYSQL*连接,
MYSQL_RES*结果,
MYSQL_RES*fresult,
MYSQL_字段*mfield
}
int查询_状态;
国际货币基金组织;
MYSQL;
MYSQL_行;
MYSQL_ROW fieldrow;
....
};
#endif//CMSYQLDB_H
这就是你的意思吗?通过
new
获取的资源应使用delete
进行分配,而使用new[]
则应使用delete[]
进行分配。就这么简单,以避免内存泄漏。如果您发布更具体的代码,可能会更有帮助
析构函数与类同名,只是它前面有一个~
符号
cmysqldb :: ~cmysqldb()
{
// deallocate the resources with the above mentioned rule
}
new int
从可以保存int
的免费存储中获取资源,并返回其地址,该地址保存在ptr
中。现在,从免费商店获取资源是因为用户定义了new
操作。因此,用户的工作就是将资源返回到免费商店。那么,析构函数中的语句-
delete ptr ;
找一本能更好解释的书。还应遵循@Michael关于使用自动管理资源的智能指针的建议。通过
new
获取的资源应使用delete
解除分配,使用new[]解除分配。
应使用delete[]
解除分配。就这么简单,以避免内存泄漏。如果您发布更具体的代码,可能会更有帮助
析构函数与类同名,只是它前面有一个~
符号
cmysqldb :: ~cmysqldb()
{
// deallocate the resources with the above mentioned rule
}
new int
从可以保存int
的免费存储中获取资源,并返回其地址,该地址保存在ptr
中。现在,从免费商店获取资源是因为用户定义了new
操作。因此,用户的工作就是将资源返回到免费商店。那么,析构函数中的语句-
delete ptr ;
找一本能更好解释的书。另外,请遵循@Michael关于使用自动管理资源的智能指针的建议。当您使用
new
或new[]获取动态内存时,会发生内存泄漏。
请勿使用delete
或delete[]解除分配内存
构造函数声明的类型为:
cmysqldb(const char *text, MYSQL *connection, MYSQL_RES *result,
MYSQL_RES *fresult, MYSQL_FIELD *mfield);
您应该使用
new
和new[]
跟踪您在构造函数中执行的任何动态内存分配,并且您应该使用相应的delete
或delete[]
取消分配所有动态内存,使用new
或new[]
&不要使用delete
或delete[]释放内存
构造函数声明的类型为:
cmysqldb(const char *text, MYSQL *connection, MYSQL_RES *result,
MYSQL_RES *fresult, MYSQL_FIELD *mfield);
您应该使用
new
和new[]
跟踪您在构造函数中执行的任何动态内存分配,并且您应该使用相应的delete
或delete[]
将它们存储在某个位置。不清楚您在哪里执行此操作(您没有构造函数接受的所有指针参数的字段),因此我无法为您提供执行此操作的确切代码,但我将介绍如何执行此操作
要声明析构函数,请在类声明中添加以下内容:
~cmysqldb();
请注意,如果您的类将具有任何虚拟方法,则应将其声明为:
virtual ~cmysqldb();
并在源文件中添加:
cmysqldb::~cmysqldb()
{
// contents of your destructor goes here.
}
现在,如何释放资源取决于资源的分配方式。如果您使用了特定于库的create函数,并且有特定于库的free函数,那么请使用该函数。如果是使用分配的,则使用;如果分配了新的,则使用删除;如果是使用new[]分配的,则使用delete[]。此外,您应该尽可能使用智能指针类,如(std::unique_ptr)或(std::shared_ptr),以避免通过构造函数/析构函数中的new/delete显式管理这些资源
最后一点非常重要。。。每当您有一个接受指针的函数时,记录所有权语义是非常重要的。它属于打电话的人吗?所有权转移了吗?等等。为了删除指针,您需要将它们存储在某个地方。不清楚您在哪里执行此操作(您没有构造函数接受的所有指针参数的字段),因此我无法为您提供执行此操作的确切代码,但我将介绍如何执行此操作 要声明析构函数,请在类声明中添加以下内容:
~cmysqldb();
请注意,如果您的类将具有任何虚拟方法,则应将其声明为:
virtual ~cmysqldb();
并在源文件中添加:
cmysqldb::~cmysqldb()
{
// contents of your destructor goes here.
}
现在,如何释放资源取决于资源的分配方式。如果您使用了特定于库的create函数,并且有特定于库的free函数,那么请使用该函数。如果是使用分配的,则使用;如果分配了新的,则使用删除;如果是使用new[]分配的,则使用delete[]。此外,您应该尽可能使用智能指针类,如(std::unique_ptr)或(std::shared_ptr),以避免通过构造函数/析构函数中的new/delete显式管理这些资源
最后一点非常重要。。。每当您有一个接受指针的函数时,记录所有权语义是非常重要的。它是自己的吗