首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的析构函数

C++中的析构函数
EN

Stack Overflow用户
提问于 2011-05-18 11:22:32
回答 3查看 1.1K关注 0票数 0

我用一个名为cmysqldb的类制作了一个头文件,这个类有很多指针。我现在的问题是:

我如何创建一个析构函数来删除可能导致潜在内存泄漏的指针?

以下是头部代码:

代码语言:javascript
复制
#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

这是你的意思吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-18 11:34:49

通过new获取的资源应该使用delete释放,而通过new[]获取的资源应该使用delete[]释放。就这么简单,以避免内存泄漏。如果你发布更具体的代码,可能会更有帮助。

析构函数具有与该类相同的名称,只不过它前面有一个~符号。

代码语言:javascript
复制
cmysqldb :: ~cmysqldb()
{
    // deallocate the resources with the above mentioned rule 
}

代码语言:javascript
复制
class foo
{
    int var ;
    int *ptr ;

    public:

        foo()
        {
             ptr = new int ;
        }

        ~foo()
        {
             delete ptr ;
        }
};

void bar()
{

    foo obj ;

    // .....

} // <-- obj goes out of scope and it's destructor is called at this point.

foo类分别有两个类型为int, int*的成员变量var, ptr。因此,在var中保存整数所需的字节和可以指向整数地址的指针(ptr)是自动分配的。这些资源不是我们分配的。因此,我们没有责任重新分配这些资源。到目前一切尚好。

代码语言:javascript
复制
ptr = new int ;

new int从可以保存int的空闲存储中获取资源,并返回ptr保存的地址。现在,从免费存储中获取资源是由于用户定义的new操作。因此,用户的工作就是将资源返回到免费商店。所以,析构函数中的语句-

代码语言:javascript
复制
delete ptr ;

The Definitive C++ Book Guide and List上获取一本书,它甚至可以更好地解释。也可以遵循@Michael关于使用智能指针的建议,智能指针可以自动管理资源。

票数 2
EN

Stack Overflow用户

发布于 2011-05-18 11:45:52

使用newnew[]获取动态内存时会发生内存泄漏,请勿使用delete或delete[]`释放内存。

构造函数声明的类型为:

代码语言:javascript
复制
cmysqldb(const char *text, MYSQL *connection, MYSQL_RES *result, 
         MYSQL_RES *fresult, MYSQL_FIELD *mfield);  

您应该跟踪使用newnew[]在构造函数中执行的动态内存分配,并且应该使用相应的deletedelete[]释放所有这些内存分配。

票数 0
EN

Stack Overflow用户

发布于 2011-05-18 12:08:12

最好的做法是使用智能指针来存储所有指向相关对象的指针。当父对象被销毁时,C++会自动调用所有子对象的析构函数。

如果你的父对象部分构造失败,它的析构函数将不会被调用。因此,如果你设计要在析构函数中释放的东西,那么任何已经分配的指针都会泄漏。但是,如果子对象是分配子对象,则运行子对象析构函数,因此通过使用智能指针,可以为您处理这种部分分配的情况。

有关更多信息,请查阅RAII (资源获取即初始化)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6039513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档