0

ここで文字列の割り当てにエラーがあります。これは、URL から取得したデータを格納するためにコーディングした関数です。編集:データノード構造

  struct node
  {
    string url;
    std::string* data;
    struct node* next;
    struct node* prev;
  };


  void RandomCache::cachePage(string* page_data, string url)
  {
    datanode *page_node= (datanode*)malloc(sizeof(datanode));
    page_node->url = url;
    page_node->data = page_data;
    page_node->next=NULL;
    page_node->prev=NULL;

    insertNode(page_node);

  }

行 page_node->url = url が Double free または破損の原因であり、データは参照ではなく値によって渡されます。誰かが何がうまくいかないのか指摘できますか?

ありがとう、私は構造をクラスにしました、そして問題は完全に解決されました。ありがとう!しかし、malloc を使用した構造メモリ管理が C++ で問題になる理由については、まだ疑問に思っています。構造体は、c++ で非常に頻繁に使用されます。

4

3 に答える 3

1

あなたが示したコードは完全に正しい C (したがって、正しい C++) です。

Q: ツリーのルートはどこに保存されていますか? 「cachePage()」と「insertNode()」の両方に表示されるクラス「RandomCache」のメンバー変数として? グローバル変数?

提案:

1)「cachePage()」関数でmalloc()スペースを確保するデータノードポインターが、実際に解放するポインターと同じであることを確認してください。あなたが示したコードから、「datanode *page_node」は「cachePage()」の外では見えない可能があります - そして、最終的にポインタを「free()」すると、実際にはランダムで初期化されていないメモリを解放しています。

2) ここでは、Valgrind が非常に役立ちます。それを試してみてください!

3) ポインターを解放した後は、必ずポインターを NULL に設定してください。

于 2014-03-26T05:29:06.283 に答える