我有这门课
class LayoutEntry
{
unsigned int id_;
string name_;
bool isInput_;
};
Run Code Online (Sandbox Code Playgroud)
复制构造函数如下所示:
LayoutEntry(const LayoutEntry &other)
: id_(other.id_),
name_(other.name_),
isInput_(other.isInput_)
{
}
Run Code Online (Sandbox Code Playgroud)
此类的对象放在另一个类中的地图内
class DataLayoutDescription
{
unsigned int sz_;
set<LayoutEntry, SortByOffset> impl;
// HERE!!!
map<unsigned int, LayoutEntry> mapById;
Run Code Online (Sandbox Code Playgroud)
这个类的复制构造函数如下所示:
DataLayoutDescription::DataLayoutDescription(const DataLayoutDescription &other)
:sz_(other.sz_), impl(other.impl), mapById(other.mapById)
{
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:
mapById(other.mapById)在DataLayoutDescription的复制构造函数中删除,那么就没有memleakname_(other.name_),内存泄漏也消失了为什么?
编辑
对于测试我最后使用BOOST :: UnitTest我得到了内存泄漏转储
C:\wc\05_EAPGit\Debug>EapLibTest.exe --run-test=SharedVectorTest
Running 7 test cases...
*** No errors detected
Detected memory leaks!
Dumping objects ->
{1378} normal block at 0x005815C0, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{1377} normal block at 0x00581580, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{1376} normal block at 0x00581540, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Run Code Online (Sandbox Code Playgroud)
可能的原因? 我使用此方法将DataLayoutDescription保存在共享内存区域中
void DataLayoutDescription::Save(LayoutEntry *les, unsigned int maxEntries) const
{
int n = std::max(impl.size(), maxEntries);
int i = 0;
for (DataLayoutDescription::iterator it = begin(); it != end(); ++it)
{
les[i] = *it; // Source of memory leak here???
++i;
}
}
Run Code Online (Sandbox Code Playgroud)
我取消引用迭代器ant存储位于共享内存区域的数组中的副本.有什么不对?退出时删除共享内存.
Furhter Trackdown 类LayoutEntry放置在共享内存区域内的数组中,并包含一个字符串.内存泄漏的原因是字符串调整大小.因此它在堆上分配更多内存.现在我想这个memroy将不会被释放,因为原始内存位于共享内存中.这可能是原因吗?接下来我将尝试删除字符串并将其替换为固定长度的char数组.
......几分钟后
就是这样.用固定的char数组替换字符串后,内存泄漏消失了.希望这有助于某人.
泄漏的原因是存储字符串的 LayoutEntry 类。基础对象(修改前)被放置在共享内存区域内的数组中。更改字符串后,执行调整大小操作,该内存丢失。将字符串替换为字符数组(固定长度)后,内存泄漏消失了。我现在很高兴,但问自己 string 类是否做错了什么,或者有没有办法将自定义分配器放入 std::string 中?我不需要这个,因为我将使用 char 数组,但我只是好奇这样的东西是否可行,并且我的假设是否正确?
这是修改后的类
class LayoutEntry
{
unsigned int id_;
char name_[128];
bool isInput_;
};
Run Code Online (Sandbox Code Playgroud)
感谢大家的帮助!调试内存泄漏的技巧对我帮助很大。