2012-05-13 10 views
4

私のコードがうまくいくようです(上記のエラーのため大きなデータセットを試していません)。stxxlキューを使用しているときに `ポインタが解放されませんでした '

コード:

#include <iostream> 
#include <queue> 
#include <stxxl/queue> 

int main() 
{ 
    //queue<int> q; //this works 
    stxxl::queue<int> q; //does not work 
    for (int i = 0; i<100; i++) { 
     q.push(i); 
    } 
    std::cout << "done copying" << std::endl; 
    while (q.empty() == false) { 
     std::cout << q.front() << std::endl; 
     q.pop(); 
    } 
    std::cout << "done poping" << std::endl; 
    return 0; 
} 

私の簡単な.stxxlは単純です:disk=./testfile,0,syscall

しかし、私のエラーは次のとおりです。

stackexchangeexample(3884) malloc: *** error for object 0x101c04000: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
The program has unexpectedly finished. 

私はそれをトラブルシューティングするかどうかはわかりません、私はする必要がありますかこの場合の空きメモリ私はまだC++を学んでいますので、これは本当に基本的なことです(これはstxxlキューを使用する場合にのみ発生します)。

+0

この質問の以前のバージョンを削除して再送信しましたか?今日私はこれを数回見てきたと確信しています。 – Blastfurnace

+0

@Blastfurnaceはいごめんなさい。誰かがコメントを投稿したので、私は今日やったことがあります(前回は、別の警告を解決するように勧められたので、設定方法を学びながら質問を削除しました。もし私がそれを自分で解決できれば(あるいは正しい方向を指し示していれば)、私は人々にそれを読む時間を無駄にしたくない。 – Lostsoul

+0

質問を編集して削除したり、修正したバージョンを再投稿したりすることはできません。 – luke

答えて

1

前にstxxlを使ったことはありませんが、それはテンプレートなので、ここでコードを見ることができます:http://algo2.iti.kit.edu/stxxl/trunk/queue_8h_source.html。あなたが初心者なので、私はいくつかを説明します。このぎこちないキューは、ポインタのキューを維持します。行00054にはtypedef ValTp value_typeが表示されますので、intvalue_typeです。 Lineの00072 & 00073は、表と裏の要素がvalue_typeであることを示しています。それらがポインタとしてどのように維持されるのか見ていますか?最後に、任意のコンストラクタを見ると、00069行に定義されているpool_type* poolが "new'd"(要素の基礎となる)になり、init関数が常に呼び出されます。 initの中では、pool->steal()が呼び出されています。詳しくは、こちらをクリックしてください。

要するに、new'd up整数をキューにプッシュする必要があります。インターフェースが間違っています。

+0

うわー。本当にありがとう、私はコードをもっと勉強し、もっと理解します。説明に時間を費やしてくれてありがとう。おそらく私はmalloc/freeや何かを使っていないと思った。 – Lostsoul

+0

もう一度jnbbenderに感謝する。理解するためにすべてのソースコードを読み込もうとしましたが、動作させるために必要なことを混乱させています。 'new'd up'整数をプッシュすることは何を意味しますか? – Lostsoul

+0

あなたは何かが 'new'd'であると言うときには' new'を使ってメモリを割り当てます。すなわち 'Integer myInt = new Integer'ここで' new'd '整数 'である。プッシュとは、それらをすべてリストに載せたということです。プッシュすることは、私が言ったはずのものではありませんが、私が言ったのは彼らを彼らのリストに入れているということです。だからそれを働かせるには: 'int p [] = {12、34、56}; q.push(p + i); 'または' int * p1 = new int(12); q.push(p1); int * p2 =新しいint(34); q.push(p2); 'ポインタを押す必要があります。 – jiveturkey

関連する問題