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;
这些向量在静态回调函数中处理,因此它们也必须是静态的。
在cpputest中,当尝试在这些向量中的任何一个中添加某些内容时,会发生失败:
Leak size: 8 Allocated at: <unknown> and line: 0. Type: "new" Content: "<\ufffdP@"
添加到矢量中的东西是自动变量,它发生在正常函数中:
t_dn_inst_pair thePair;
thePair.theDn = updated_dn;
thePair.theInstance = updated_instance;
在测试用例结束时清除向量:
xxxx::yyyy()->dninstList.clear();
(yyyy()返回指向单例xxxx对象的指针)
Page http://blog.objectmentor.com/articles/2010/02/04/cpputest-recent-experiences 讨论了同样的内存泄漏:
“这是误报。这是一次性分配和 C ++内存分配和静态初始化的副作用。“
所以我的问题是: 这种失败真的是假阳性吗?
br Esko
答案 0 :(得分:3)
你和valgrind一起检查了吗?它会将“绝对丢失”的泄漏内存与“仍可访问”的内存区分开来。如果它是误报,它应该仍然可以访问(通过向量中的指针。)
请记住,vector::clear()
只是破坏元素,它不会释放任何内存,因此capacity()
将保持不变。
您可以执行交换技巧以强制向量释放其内存:
vector<t_dn_inst_pair>().swap(xxxx::yyyy()->dninstList);
创建一个临时(空)向量并将其与向量交换,因此向量的元素和已分配的内存将被转移到临时值,然后在语句结束时被销毁。
P.S。单身人员很糟糕,不要使用它们,但是如果它是静态成员,你为什么要以yyyy()->dninstList
(即使用operator->
)访问向量?您可以说xxxx::dninstList
或者使其成为非静态成员并通过单例对象访问它(但不要忘记单身人员吮吸。)