【发布时间】:2015-01-13 09:12:40
【问题描述】:
这是First Question 的后续问题。
我有这门课:
class Foo
{
std::map<char**, char*> values;
public:
~Foo() { cleanAll(); }
void cleanAll() {
for(auto& value : values)
{
delete[] value.second;
}
}
template<typename T> bool isChanged(T& entry)
{
char** addr = reinterpret_cast<char**>(&entry);
auto it = values.find(addr);
if(it == values.end())
{
char* oldBuf = new char[sizeof(T)];
T* oldEntry = new(oldBuf) T;
*oldEntry = entry;
values[addr] = oldBuf;
}
else
{
T* oldEntry = (reinterpret_cast<T*>(it->second));
if(entry != *oldEntry)
{
oldEntry->~T();
oldEntry = new(it->second) T;
*oldEntry = entry;
return true;
}
}
return false;
}
};
当我用像 aFoo.isChange(aInt) 这样的 POD 调用它并且 aFoo 被破坏时,一切都很好。但是当使用像aFoo.isChange(aString) 这样的复杂类型调用它并且aFoo 被破坏时,就会出现内存泄漏。我认为这是因为析构函数不知道映射中 char* 背后的内容,而只是调用 char 析构函数,而不是它指向的实际类型之一。
有没有办法在不改变映射values的情况下摆脱这种内存泄漏?
【问题讨论】:
-
这很容易惨败:
char** addr = reinterpret_cast<char**>(&entry); -
为什么?它只是用作地图的键。没有别的了。
-
至少我什至不知道您为什么要尝试使用指针作为映射键。它们不会像您想象的那样在那里工作。
-
人们使用演员表时的警钟。也使析构函数虚拟
标签: c++ templates memory-leaks destructor