我有这个类
复制构造函数长这样:
这个类的复制构造函数如下所示:
现在的问题是:
我将解除迭代器并将其副本存储在共享内存区域中的数组中。这样做是否有问题?共享内存将在退出时删除。
进一步跟踪: 类LayoutEntry放置在共享内存区域内的数组中,并包含一个字符串。内存泄漏的原因是该字符串被重新调整大小,从而在堆上分配更多内存。现在我猜测,由于原始内存位于共享内存中,因此这些内存可能不会被释放。这可能是原因吗?接下来,我将尝试删除该字符串,并用固定长度的char数组替换它。
...几分钟后
就是这样。将字符串替换为固定长度的char数组后,内存泄漏消失了。希望这能帮助到某些人。
class LayoutEntry
{
unsigned int id_;
string name_;
bool isInput_;
};
复制构造函数长这样:
LayoutEntry(const LayoutEntry &other)
: id_(other.id_),
name_(other.name_),
isInput_(other.isInput_)
{
}
该类的对象被放置在另一个类的映射中。
class DataLayoutDescription
{
unsigned int sz_;
set<LayoutEntry, SortByOffset> impl;
// HERE!!!
map<unsigned int, LayoutEntry> mapById;
这个类的复制构造函数如下所示:
DataLayoutDescription::DataLayoutDescription(const DataLayoutDescription &other)
:sz_(other.sz_), impl(other.impl), mapById(other.mapById)
{
}
现在的问题是:
- 按照打印出来的方式运行时,每个LayoutEntry都会有一个内存泄漏
- 如果我在DataLayoutDescription的复制构造函数中删除
mapById(other.mapById)
,那么就不会有内存泄漏了 - 如果我删除
name_(other.name_),
,那么内存泄漏也会消失
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.
可能的原因? 我使用这种方法在共享内存区域中保留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;
}
}
我将解除迭代器并将其副本存储在共享内存区域中的数组中。这样做是否有问题?共享内存将在退出时删除。
进一步跟踪: 类LayoutEntry放置在共享内存区域内的数组中,并包含一个字符串。内存泄漏的原因是该字符串被重新调整大小,从而在堆上分配更多内存。现在我猜测,由于原始内存位于共享内存中,因此这些内存可能不会被释放。这可能是原因吗?接下来,我将尝试删除该字符串,并用固定长度的char数组替换它。
...几分钟后
就是这样。将字符串替换为固定长度的char数组后,内存泄漏消失了。希望这能帮助到某些人。