我用一个名为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这是你的意思吗?
发布于 2011-05-18 11:34:49
通过new获取的资源应该使用delete释放,而通过new[]获取的资源应该使用delete[]释放。就这么简单,以避免内存泄漏。如果你发布更具体的代码,可能会更有帮助。
析构函数具有与该类相同的名称,只不过它前面有一个~符号。
cmysqldb :: ~cmysqldb()
{
// deallocate the resources with the above mentioned rule
}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)是自动分配的。这些资源不是我们分配的。因此,我们没有责任重新分配这些资源。到目前一切尚好。
ptr = new int ;new int从可以保存int的空闲存储中获取资源,并返回ptr保存的地址。现在,从免费存储中获取资源是由于用户定义的new操作。因此,用户的工作就是将资源返回到免费商店。所以,析构函数中的语句-
delete ptr ;从The Definitive C++ Book Guide and List上获取一本书,它甚至可以更好地解释。也可以遵循@Michael关于使用智能指针的建议,智能指针可以自动管理资源。
发布于 2011-05-18 11:45:52
使用new或new[]获取动态内存时会发生内存泄漏,请勿使用delete或delete[]`释放内存。
构造函数声明的类型为:
cmysqldb(const char *text, MYSQL *connection, MYSQL_RES *result,
MYSQL_RES *fresult, MYSQL_FIELD *mfield); 您应该跟踪使用new和new[]在构造函数中执行的动态内存分配,并且应该使用相应的delete或delete[]释放所有这些内存分配。
发布于 2011-05-18 12:08:12
最好的做法是使用智能指针来存储所有指向相关对象的指针。当父对象被销毁时,C++会自动调用所有子对象的析构函数。
如果你的父对象部分构造失败,它的析构函数将不会被调用。因此,如果你设计要在析构函数中释放的东西,那么任何已经分配的指针都会泄漏。但是,如果子对象是分配子对象,则运行子对象析构函数,因此通过使用智能指针,可以为您处理这种部分分配的情况。
有关更多信息,请查阅RAII (资源获取即初始化)。
https://stackoverflow.com/questions/6039513
复制相似问题