如下使用C++驱动的sdbCursor类对象会造成内存泄漏:INT32 rc = SDB_OK;
BSONObj matcher = BSON(a
sdbCursor cursor;
while(TRUE)
{
rc = cl.query(cursor, matcher);
if (SDB_OK == rc)
{
BSONObj record;
rc = cursor.next(record);
if (SDB_OK == rc)
{
// do something
break;
}
else if (SDB_DMS_EOC == rc)
{
// 分支1
// do something
continue;
}
else
{
goto error;
}
}
else
{
goto error;
}
}
当程序通过游标获取记录失败(此时错误类型为SDB_DMS_EOC ,错误码为-29)时,程序走到分支1,程序执行continue继续循环查询。由于cursor对象中保存了由query函数在其内部malloc开辟的内存,该内存在cursor调用析构函数时才会释放。所以,当把cursor定义在循环外面,当每次程序走到分支1而又回去循环时,都会造成一次内存泄漏。
目前(v2.8)可如下规避此问题:
INT32 rc = SDB_OK;
BSONObj matcher = BSON(a
{
sdbCursor cursor; // 将cursor的定义移到此处
rc = cl.query(cursor,matcher);
if (SDB_OK == rc)
{
BSONObj record;
rc = cursor.next(record);
if (SDB_OK == rc)
{
// do something
break;
}
else if (SDB_DMS_EOC == rc)
{
// 分支1
// do something
continue;
}
else
{
goto error;
}
}
else
{
goto error;
}
}
我们只需要把cursor的定义放到循环块的内部。这样,cursor的作用于便只在循环块的内部,于是,每回循环结束,cursor都会调用其析构函数,从而释放query函数为其分配的内存。