スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C++] コンテナ(stack,queue)のpop()

セグメンテーションエラーの巻


次のプログラムは、一応動きますが…。

#include <iostream>
#include <queue>

using namespace std;

int main(){
queue<int> q;

q.push(3);
while (!q.empty()){
int &a =q.front();q.pop();
cout<<a<<endl;
if (0<a){
q.push(a-1);
q.push(a-2);
}
}

return 0;
}

動けばおk?


int型をクラスに置き換えたようなプログラムを書いていたのですが、セグメンテーションエラーを引き起こしました。

cerrでデバッグを吐き出しつつ検証した結果、empty()で吐いていました。
emptyがおかしい?そんなことは無い。一番厄介なエラーです。


正しい解はこっち
#include <iostream>
#include <queue>

using namespace std;

int main(){
queue<int> q;

q.push(3);
for (;!q.empty();q.pop()){
int &a =q.front();
cout<<a<<endl;
if (0<a){
q.push(a-1);
q.push(a-2);
}
}
return 0;
}


前者のプログラムでは、int &aがqueueの先頭要素を参照しています。
queue.pop()を実行すると、queueの先頭が削除されます。

ガベージコレクタを実装しないC++やCはそんな事を知らず、queue.popが呼び出されたら
先頭要素をqueueから切り離し、デストラクタを呼ぶ。

int &aの参照先は既にデストラクタが呼び出された後の無を参照することになります。アカン!


後者のプログラムでは、おそらく使い終わったタイミングでpopしています。
これならエラー吐かない…はず。


他の対策としては、int &aではなくint aにするとか。
要素参照ではなく、丸々コピーする作戦ですね。


JavaやRubyと同じ感覚でスタック・キュー使っていると痛い目会います。僕は会いました。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : c++

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
635位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
94位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。