2017-05-06 1 views
0

ここにコードの要点がありますが、この質問にコードを追加することができます。私の単純なC++プログラムがキューと連動していて、無効なポインタにfstreamエラーが出るのはなぜですか?

https://gist.github.com/alevnyaa/e917bc2aa1e72aa210d8cff9fa5e922b

私はさえないですしたようprint_queueがライン62で呼び出された後、プログラムがクラッシュ最初の数行を通じて働いた後、C++ 11 Linux上でG ++ 6.3でこのプログラムをコンパイルして実行手動でポインタやメモリを操作すると、私はこの問題が何であるか分かりません。

*** Error in `./a.out': free(): invalid pointer: 0x0000000000606160 *** 

私は任意の提案を試すことができます。私は単純な問題に気づいていないと仮定していますが、それを何度も見てから盲目になっています。

まずファイルD301.txt

D301 Capacity 40 

1 1    5 
2  2  4 
3   3 4 
4   
5  2   
6   
7 1 

ifqueue.cpp

#include <fstream> 
#include <iostream> 
#include <queue> 

void stoq(std::queue<char>& q, std::string s){ 
    std::queue<char> empty; 
    std::swap(q, empty); 
    for(char ch : s){ 
    if(!isspace(ch)){ 
     q.push(ch); 
    } 
    } 
} 

std::string print_queue(std::queue<char> q){ 
    std::cout << "Queue: "; 
    int i = 0; 
    while(!q.empty()){ 
    std::cout << "i" << i; 
    i++; 
    std::cout << q.front(); 
    q.pop(); 
    } 
    std::cout << std::endl; 
} 

int main(){ 
    std::fstream infile("D301.txt"); 
    std::string line; 
    std::queue<char> q; 
    std::getline(infile, line); 
    stoq(q, line); 

    print_queue(q); 

    std::string classroom_name; 
    while(q.front() != 'C'){ 
    classroom_name += q.front(); 
    q.pop(); 
    } 

    for(int i=0; i<8; i++){ 
    q.pop(); 
    } 

    std::string capacity_str; 

    while(!q.empty()) { 
    capacity_str += q.front(); 
    q.pop(); 
    } 

    int capacity = stoi(capacity_str); 

    std::getline(infile, line); 
    while(infile){ 
    std::getline(infile, line); 
    std::cout << "fl" << std::endl; 
    stoq(q, line); 
    std::cout << "sl" << std::endl; 
    print_queue(q); 
    std::cout << "tl" << std::endl; 
    } 

    infile.close(); 
} 

は-1本当に保証された:?

はここ

コードですありがとう

+0

ここに関連コードを直接掲載してください。 – Carcigenicate

+0

stackoverflow.com上のすべての質問は、問題を無意味にする、いつでも動作を停止することができますいくつかの外部Webサイトへのリンクの代わりに、質問自体に完全な情報を含める必要があります。 "なぜ私のコードは機能していないのですか?"という形式のすべての質問には、[mcve]が含まれていなければなりません。詳細については、このヘルプセンターの記事を参照し、質問を編集して[mcve]を追加してください。 –

答えて

1

キューが空の場合はどうなりますか?

while(q.front() != 'C'){ 
     classroom_name += q.front(); 
     q.pop(); 
    } 

キューの要素が8個未満の場合はどうなりますか?

for(int i=0; i<8; i++){ 
    q.pop(); 
    } 
+0

2番目のポイントについては、問題はないようにフォルダ構造が設定されています。あなたの最初については、もう一度ファイル形式が標準化されています。 –

+0

良い!最初の行がクラッシュして、私はそれを打ちました。 – didiz

1

なぜこのようなエラーが発生したのかは不明です。それは実際に文字列を返していないので

無効print_queue

print_queue

のstd ::文字列:しかし、修正は機能を変更しているようです。

誰かが私がそのような種類のエラーを出している理由を突き止めることができれば、私は喜んで見つけることができます。

+0

関数が未定義のビヘイビアを必要とするときに値を返さない – didiz

関連する問題