gcc / linux:CppuTest使用静态向量显示内存泄漏,误报?

在xxxx.h文件中:

struct dn_instance_pair { std::string theDn; int theInstance; }; typedef struct dn_instance_pair t_dn_inst_pair; struct table_rowid_type { char theTable[101]; sqlite3_int64 theRowid; int operation; }; // static class members static vector<t_dn_inst_pair> dninstList; static vector<t_table_rowid_type> tablerowidList; 

在xxxx.cpp中

 // declaration of vectors. // Included to this post only for completeness. vector<t_dn_inst_pair> xxxx::dninstList; vector<t_table_rowid_type> xxxx::tablerowidList; 

这些向量在静态callback函数中处理,所以它们也必须是静态的。

在cpputest中,当试图在这些向量的任何一个中添加某个东西时,会发生一个失败:

 Leak size: 8 Allocated at: <unknown> and line: 0. Type: "new" Content: "<\ufffdP@" 

添加到vector的东西是自动variables,它发生在一个正常的function:

 t_dn_inst_pair thePair; thePair.theDn = updated_dn; thePair.theInstance = updated_instance; 

在testing用例的最后清除vector:

 xxxx::yyyy()->dninstList.clear(); 

(yyyy()返回一个指向单身xxxx对象的指针)

页面http://blog.objectmentor.com/articles/2010/2010/04/cpputest-recent-experiences讨论了同样types的内存泄漏

“这是一个误判,这是C ++内存分配和静态初始化的一次性分配和副作用。

所以我的问题是:这个失败真的是一个误报吗?

埃斯科

你用valgrind检查过吗? 它将区分“已经丢失”的泄漏内存和“仍然可以访问”的内存。 如果这是一个误报,它应该仍然可以(通过向量中的指针)。

请记住, vector::clear()只是销毁元素,并不会释放任何内存,所以capacity()将保持不变。

你可以做交换技巧来强制向量释放它的内存:

 vector<t_dn_inst_pair>().swap(xxxx::yyyy()->dninstList); 

这将创建一个临时(空)的向量,并与你的向量交换,所以你的向量的元素和分配的内存将被转移到临时的,然后在语句结束时被销毁。

PS单身人士吸,不要使用它们,但为什么你访问矢量为yyyy()->dninstList (即使用operator-> ),如果它是一个静态成员? 你可以说xxxx::dninstList或使其成为一个非静态成员,并通过单身对象访问它(但不要忘记单身人士吸)。