web-dev-qa-db-ja.com

C ++エラー: 'std :: bad_alloc'のインスタンスをスローした後に呼び出される終了

Eclipseで以下のコードを使用すると、「 'std :: bad_alloc' what():std :: bad_allocのインスタンスをスローした後に呼び出される」というエラー終了が表示されます。

RectInvoiceクラスとInvoiceクラスがあります。

class Invoice {
public:

    //...... other functions.....
private:
   string name;
   Mat im;
   int width;
   int height;
   vector<RectInvoice*> rectInvoiceVector; 
};

そして、私は請求書のメソッドで以下のコードを使用します。

        // vect : vector<int> *vect;

        RectInvoice rect(vect,im,x, y, w ,h);
        this->rectInvoiceVector.Push_back(&rect);

そして、Eclipse.iniファイルのEclipseメモリを変更したいと思います。しかし、私はこれを許可していません。どうすればいいですか?

20
andressophia

コードの問題は、ローカル変数(関数に対してローカルなど)のメモリアドレスを球状変数に格納できないことです。

RectInvoice rect(vect,im,x, y, w ,h);
this->rectInvoiceVector.Push_back(&rect);

そこ、 &rectは一時的なアドレス(関数のアクティベーションレジストリに格納されている)であり、その関数が終了すると破棄されます。

コードは動的変数を作成する必要があります。

RectInvoice *rect =  new RectInvoice(vect,im,x, y, w ,h);
this->rectInvoiceVector.Push_back(rect);

そこでは、関数の実行の終了時に破棄されないヒープアドレスを使用しています。うまくいったかどうか教えてください。

乾杯

21
Agus Arias

何かがstd::bad_alloc型の例外をスローし、メモリ不足になったことを示します。この例外はmainまで伝播され、そこでプログラムから「落ち」、表示されるエラーメッセージが表示されます。

ここではだれも「RectInvoice」、「rectInvoiceVector」、「vect」、「im」などが何であるかを知らないため、メモリ不足状態の正確な原因を説明することはできません。 w hは構文エラーのように見えるため、実際のコードさえ投稿していません。

14
Christian Hackl