Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的析构函数+;_C++_Pointers_Destructor - Fatal编程技术网

C++ C+中的析构函数+;

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() {

我用一个名为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显式管理这些资源

最后一点非常重要。。。每当您有一个接受指针的函数时,记录所有权语义是非常重要的。它是自己的吗