【发布时间】:2015-10-26 13:19:39
【问题描述】:
我遇到了这种问题:可能内存泄漏。
想象一下,如果您为同一个键存储两个不同的堆指针。
#include <map>
std::map<int, int*> myMap;
void Store(int key, int* value)
{
myMap[key] = value;
}
int main()
{
Store(42, new int(42));
Store(35, new int(35));
delete myMap[42];
delete myMap[35];
}
我想过这样解决:
#include <map>
std::map<int, int*> myMap;
void Store(int key, int* value)
{
auto it = myMap.find(key);
if (it != myMap.end()))
{
delete it->second;
it->second = value;
}
else
{
myMap[key] = value;
}
}
int main()
{
Store(42, new int(42));
Store(35, new int(35));
delete myMap[42];
delete myMap[35];
}
但是现在有两个对数查找而不是一个...
然后我想到了下面这段代码,
#include <map>
std::map<int, int*> myMap;
void Store(int key, int* value)
{
auto& mappedValue = myMap[key];
if (mappedValue == nullptr)
{
mappedValue = value;
}
else
{
delete mappedValue;
mappedValue = value;
}
}
int main()
{
Store(42, new int(42));
Store(35, new int(35));
delete myMap[42];
delete myMap[35];
}
但是如果没有关联的值,我怎么能确定 mappedValue 总是指向 nullptr 呢?
您建议如何解决内存泄漏并坚持对数复杂性?
编辑:重构成本非常高,我正在寻找没有智能指针的解决方案。
【问题讨论】:
-
为什么要存储
int*而不仅仅是int? -
这是遗留代码。重构的成本很高。
-
“可能存在内存泄漏。”你可以加强这种说法。第一段代码为确定内存泄漏。
-
好的抱歉我发布的误导性代码,我现在正在编辑它。
-
不使用智能指针将您带到这里,这是有时间成本的。您所做的每项更改都需要调试和测试以证明正确的释放(以及不使用释放的对象)。重构以使用智能指针最终将被证明是一个数量级的更少成本。
标签: c++ performance dictionary memory-leaks