我有以下代码,我想让它更好地工作并且更快。我想我应该改变擦除方法。请问有什么想法吗?我想我有内存泄漏,但我不知道该改变什么。
#include <iostream>
#include <unordered_map>
#include <string>
class DocumentStorage
{
class Document
{
public:
Document(std::string& title, std::string& content)
{
this->title = title;
this->content = content;
}
std::string title;
std::string content;
};
public:
void add(int id, std::string title, std::string content)
{
storage[id] = new Document(title, content);
}
void remove(int id, std::string& title, std::string& content)
{
std::unordered_map<int, Document*>::iterator it = storage.find(id);
Document* doc = it->second;
title = doc->title;
content = doc->content;
storage.erase(it);
}
void clear()
{
storage.clear();
}
private:
std::unordered_map<int, Document*> storage;
};
#ifndef RunTests
int main()
{
DocumentStorage storage;
storage.add(123456, "Hamlet", "Hamlet, Prince of Denmark.");
storage.add(123457, "Othello", "Othello, the Moore of Venice.");
std::string title, content;
storage.remove(123456, title, content);
std::cout << title << '\n';
std::cout << content;
storage.clear();
}
#endif
答案 0 :(得分:2)
保留您通过新分配的Document*
集合,意味着您可以通过致电delete
来承担删除它们的责任。
最简单的(C ++ 11)修复方法是将存储更改为:
std::unordered_map<int, std::unique_ptr<Document>>
答案 1 :(得分:0)
添加某种状态成员并在需要时启动它。类似的东西:
class Document
{
bool _inactive; // it equals false by default
};
...
删除功能中的:
void remove(...)
{
...
doc->setInactive();
}
最后你应该声明你自己的find函数,它会传递那些标记为非活动的记录。
我知道这有点奇怪,但希望它能起作用:)。