2016-08-12 7 views
-1

私は以下のコードを持っています。私は消去方法を変えなければならないと思う。どのようなアイデアをしてください?私はメモリリークがあると思うが、何を変えるべきか分からない。新しい経由で割り当てられてきたDocument*のコレクションを維持メモリと時間節約のために関数C++を消去する代わりに

#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 
+1

Faster?この機能がアプリケーションのボトルネックであることを測定しましたか? –

+0

私はコードをより速くしたいと思っています。問題はコードのその部分にあると思いました。別の考えがありますか? –

+0

それで、 'Document'オブジェクトを修正して、それを直ちに消去するだけですか?誰が '文書* 'を所有していますか? 'storage'以外に何かがありますか? – Chad

答えて

2

、あなたがdeleteを呼び出すことによってそれらを除去するための責任を取ることを意味します。状態メンバーのいくつかの並べ替えを追加して、必要なときにそれを開始

std::unordered_map<int, std::unique_ptr<Document>> 
0

(C++ 11)最も簡単なあなたの場合には修正がにあなたのストレージを変更することです。以下のようなもの:

class Document 
{ 
    bool _inactive; // it equals false by default 
}; 

...あなたのremove関数で

void remove(...) 
{ 
    ... 
    doc->setInactive(); 
} 

、最終的にあなたが非アクティブとしてマークされ、それらのレコードを通過する独自の検索機能を、宣言する必要があります。

これはちょっと奇妙だと分かっていますが、うまくいくと思います:)

関連する問題