2012-03-26 9 views
3

STLベクトルの内容をC文字列として返す関数vect_dbg(vector<int>)をテスト中ですので、gdb output vect_dbg(test)で呼び出すか、ウォッチ。ローカルスコープからstd :: vectorへのgdb関数の呼び出しでエラーが発生する

#include<vector> 
using namespace std; 

int main() 
{ 
    vector<int> test; //breakpoint; output vect_dbg(test) ends debugging. 
    for (int i=0;i<=10;i++) test.push_back(i); 
    return 0; 
} 

#include<sstream> 
const char* vect_dbg(const vector<int> &V) 
{ 
    stringstream ss; 
    for (int i=0;i<V.size();i++) 
     ss<<"V["<<i<<"]:"<<V[i]<<' ;'; //line 16 
    static char sEnu[256]; 
    ss.getline(sEnu,256); 
    return sEnu; 
} 

残念ながら、output vect_dbg(test)はデバッグを中断します。

デバッグ中のプログラムは、GDBの という関数で通知されました。 GDBは、コールの前の状態にコンテキストを復元しました。 この動作を変更するには、 "set unwindonsignal off"を使用してください。関数(vect_dbg(std :: vector> const &)を含む式 の評価は中止されます)。受け取ったプログラムは、 シグナルSIGSEGV、セグメンテーションフォルトです。 main.cppにでvect_dbg (V = @ 0x22ff34)で0x004014b1は:16

私はtestグローバル作る場合、この関数が機能することを発見した、しかし、私は、ローカルに定義されたベクトルのための解決策を見つけ出すことができませんでした。どうすればこの問題を解決できますか?どうもありがとう。

EDIT:主に解決された答えはかなり明白でした。ベクターはブレークポイントで初期化されませんでした。今私はそれがvect_dbgでそれを検出することが可能かどうか疑問に思っています。 私が見つけた別の方法は、vector<int>を静的と宣言することです。

答えて

3

ブレークポイントを1行後に入力してください(forループ)。変数testは、使用しようとするとまだ初期化されていません。

+0

あなたの言っていることを理解するまでには1分ほどかかりました。ブレークポイントがヒットしたときに、 'test'のコンストラクタはまだ実行されていません。 –

+0

あなたは正しいです、ありがとう。それは私が最初に試したことだったことを覚えているので変だ。 – algotroll

関連する問題