2011-12-15 7 views
4

非常にC++で経験していない、私は次のことを持っている:ポインタが無効です - なぜですか?

void read_image(vector<unsigned char>* buffer) { 
    buffer = new vector<unsigned char>(2048); 
} 

int main(int argc, char ** argv) { 
    vector< unsigned char > *buffer; 

    read_image(buffer); 

    delete buffer; // gives invalid pointer at run-time 

    return 0; 
} 

これはコードの関連部分のみで、基本的に私はread_image()にポインタbufferを初期化したいです。実行時にヒープを解放しようとしているときにこれを取得しています:

*** glibc detected *** ./main: free(): invalid pointer: 0x00007fff0648556c *** 

私のアプローチには何が問題なのですか?

答えて

11

あなたは)参照によってbufferを送信する(またはvector<unsigned char>*) when calling read_image`へのポインタとして、そのための機能が機能(すなわち、発信者の外部に更新を伝播することができませんされていません。


このあなたの関数の変更は、あなたが望む何になります:

void read_image(vector<unsigned char>*& buffer) { 
    buffer = new vector<unsigned char>(2048); 
} 

今はread_imageにパラメータとして参照を渡すと、元の変数から返された値で更新されますnew vector<...> (...)


あなたはポインタ狂信ある場合はこれも有効です。我々は、ポインタ自体のアドレスread_image与えている上に、ポインタへのこのポインタデリファレンスたちができる内部には

void read_image (vector<unsigned char>** buffer) { 
    *buffer = new vector<unsigned char>(2048); 
} 

... 

read_image (&buffer); 

元のポインタが指す値を設定します。

言い訳を言い訳すると、私は正直言ってかなり疲れました。


参考資料の使用に関するよくある質問。

+0

はそれはそれはポインタであるにも関わらず、参照する必要があります - あなたの条件についての私の推測が正しければ

あなたはこのような何かをすべきか? – rdoubleui

+2

本当の質問は、なぜ彼が動的に 'ベクトル'を割り当てるのかということです。動的に 'ベクトル 'を割り当てることは意味があるケースはごくわずかです。 –

+1

@rdoubleui呼び出し関数内のポインタを変更する場合は、そのポインタへの参照を渡す必要があります。ポインタは、その点で他のデータ型と変わらない。 –

2
void read_image(vector<unsigned char>* & buffer) { // passed by reference 
    buffer = new vector<unsigned char>(2048); 
} 

int main(int argc, char ** argv) { 
    vector< unsigned char > *buffer; 

    read_image(buffer); 

    delete buffer; // gives invalid pointer at run-time 

    return 0; 
} 
2

私はそう私はあなたがここにベクトルを必要とする理由を知らないあなたは一つの画像よりも多くを保持できるバッファを作成したいと思います。

void read_image(vector<unsigned char*>& buffer,int size) { 
    char* p = new char[size]; 
    buffer.push_back(p); 
} 
void process_image_buffer(char* image_buffer) { 
    // Do something with image_buffer 
} 
int main(int argc, char ** argv) { 
    vector<unsigned char*> buffer; 
    for all images 
     // calculate the unknown size at runtime here e.g.by taking input from user 
     read_image(buffer,size); 

    // Do Image Processing 
    // process each image buffer in a for loop 
    for all images (i < buffer.size()) 
     process_image_buffer(buffer[i]); 

    // Free all at end 
    for all images (i < buffer.size()) 
     delete[] buffer[i]; 
    return 0; 
} 
+0

あまりにも、1つの画像しかありません。単一のイメージを持つベクトルなしでイメージ処理をどのように扱いますか? – rdoubleui

+1

@rdoubleui:上記のprocess_image_buffer関数を追加しました。 – Ameliorator

+0

さて、あなたは 'ベクトル'の代わりに 'char'配列を提案しています。 'vector'リファレンスを渡すのではなく、それを使う利点はありますか? – rdoubleui

関連する問題