2016-09-11 3 views
1
CImg<float>* img = NULL; 
bool loaded; 

while (!loaded) 
{ 
    loaded = true; 
    try 
    { 
     img = &CImg<float>(filename); 
    } 
    catch (CImgException) 
    { 
     loaded = false; 
     fprintf(stdout, "ERROR: could not load %smap file.\n", mapname); 
    } 
} 

私はCIMGを見つけて読み取ることができ、有効なイメージファイル名を入力し、img.width()img.height()両方-858993460を返します。 documentationによれば、img.width()の戻り値の型はintですが、フェッチする値はimg._widthunsigned intです。CImg <float>の幅と高さが負の値を持つのはなぜですか?

+1

これは実際のコードですか?あなたは一時的なアドレスを取ることはできません。 – GManNickG

答えて

0

GManNickGがコメントに記載されているように、行img = &CImg<float>(filename);CImg<float>の一時オブジェクトが作成され、そのアドレスを変数imgに保存します。この一時的なオブジェクトは、ブロック内でのみ有効です。

try 
{ 
    img = &CImg<float>(filename); 
} 

実行がこのスコープを残し、あなたには、いくつかのランダムな内容(例えば-858993460_widthのフィールド)で無効なポインタを持っているとき、それは破壊されます。

+0

'new'を使用すると、ヒープに割り当てられます。オブジェクトインスタンスを初期化し、このメソッドが呼び出されたスコープ(たとえば)に属させる方法がありますか?私が従ったポインタ上のプライマーはこれに触れていません。 – ophilbinbriscoe

+0

@ philbinbriscoe 'CImg ' classには[copy constructor](http://cimg.eu/reference/structcimg__library_1_1CImg.html#aff97beaa34b9061351711dcdaed85c58)と['move_to'](http://cimg.eu/reference/structcimg__library_1_1CImg.html)があります。 #a09aeb03ffe6512209f64b92fbef9574c)メソッドを使用します。 'img'を' CImg img; 'として宣言し、' img = CImg (filename);を単に割り当てることができます。 – Nikita

関連する問題