在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
或使其成为一个非静态成员,并通过单身对象访问它(但不要忘记单身人士吸)。