0

私はC ++を初めて使用します。それについて教えてください。どうもありがとう。

(新しい型の配列) をクラスに渡したい。しかし、「bad_allocのインスタンスをスローした後にc ++の終了が呼び出されました」というメッセージが表示されました。これはどういう意味ですか? 再度、感謝します!!!!

#include <iostream>

using namespace std;

class test {
  public:
      test (int*, int);
       void check ();
  private :
    int k;
     int *a= new int [k];
//int a;

};


int main()
{
  //int a1=5,n=4;
  int n=4;
  int *a1= new int[n];
   //int a1[4]={1,2,3,4};
  test haha(a1,n);
  haha.check();

    return 0;
}


test::test(int *aa, int kk){
a=aa;
k=kk;
}

void test::check()
{
 for(int i=0; i<k; i++){
    cout<<a<<" ";

 }

}
4

5 に答える 5

1
class test {
  public:
      test (int*, int);
       void check ();
  private :
    int k;
     int *a= new int [k]; <--- problem, k is undefined + you don't allocate in class declerations
//int a;

};

クラス宣言で割り当てることはできません..特に未定義のメンバーでは割り当てられません:)

その上..あなたはすでにc'torにポインターを割り当てています(あなたがそれらに値を与えているわけではありません...)

于 2013-03-28T16:27:05.723 に答える
1

これらはコードのすべての問題であり、出現順にリストされています。また、いくつかのヒントを提供しました。

  1. 非静的データ メンバーのクラス内初期化は、C++11 より前のコードでは許可されていません。したがって、次の行は無効です。

    private:
    // ...
        int *a = new int [k];
    //         ^^^^^^^^^^^^^^
    

    それだけでなく、この行は不要です。ポインターを受け取るコンストラクターが既にあり、そのポインターを に割り当てますa。したがって、クラス内での割り当ては必要ありません。

  2. のコンストラクタはtest上記で定義する必要がありますmain。また、ヒント: member initializer-listでメンバーを初期化する必要があります。コードでは次のようになります。

    test::test(int *aa, int kk) : k(kk), a(aa) {}
    //                          ^^^^^^^^^^^^^^
    

    コロンに続くのは、コロンで区切られたメンバーの初期化です。

  3. 次の行は、時刻のアドレスを出力しています。a k

    cout << a << " ";
    

    あなたはこれをしたくありません。ポインタが指すメモリ内のアドレスを表す 16 進数を出力します。ポインターが指す値を出力するには、ポインターを逆参照する必要があります。

    cout << *a << " ";
    

    注:配列を値で初期化していないため、出力されるのはスタックからのガベージだけです。配列にいくつかの値を割り当てるには、次のようにします (配列を宣言する main 内)

    int *a1 = new int[n];
    
    a1[0] = 1;
    a1[1] = 2;
    a1[2] = 3;
    a1[3] = 4
    

    または、for ループを使用できます。

    for (int i = 1; i <= 4; ++i)
    {
        a1[i - 1] = i;
    }
    

    または、C++11 でコンパイルしている場合 (おそらくそうではないでしょう):

    int *a1 = new int[n] {1, 2, 3, 4};
    

    delete[]しかし、最も重要なことは、配列を使い終わったら忘れないことです。new/で作成したものnew[]はすべて削除する必要があります:

    delete[] a1;
    

    とにかく、次を使用することで、メモリの割り当てと混乱を回避できますstd::vector(IMHOの方がはるかに優れています)。

    #include <vector>
    
    std::vector<int> a1 = {1, 2, 3, 4};
    

    std::vector配列の長さを渡す必要のないサイズに関する情報が含まれています。ベクトルを使用すると、プログラムが大幅に簡素化されます。

そして、これがあなたのプログラムです:

#include <iostream>
#include <vector>

class test {
  public:
      test(std::vector<int>);
      void check();

   private:
      std::vector<int> v;
};

test::test(std::vector<int> temp) : v(temp) {}

void test::check()
{
   std::vector<int>::const_iterator it;

   for (it = v.begin(); it != v.end(); ++it) {
      std::cout << *it << std::endl;
   }
}

int main()
{
  std::vector<int> a1 = {1, 2, 3, 4};

  test haha(a1);
  haha.check();
}

ライブデモ

于 2013-03-28T16:47:46.543 に答える
0
int k;
 int *a= new int [k];

これが問題です。クラス インスタンスを作成するとき、k は初期化されておらず、配列サイズとして使用しています。

于 2013-03-28T16:28:15.670 に答える
0

あなたのクラスで:

 int *a= new int [k];

これはエラーになります: k はまだ定義されていないためです。

error: `test::k' cannot appear in a constant-expression
error: `new' cannot appear in a constant-expression
error: ISO C++ forbids initialization of member `a'
error: making `a' static
error: invalid in-class initialization of static data member of non-integral type `int*' In constructor `test::test(int*, int)':

= new int[k]の宣言から削除し、コンストラクター*a で初期化する必要があります。*a

于 2013-03-28T16:29:43.770 に答える
0

おそらく、動的メモリ割り当ての代わりに std::vector を使用する必要があります。特にメモリを削除していないことを考えると。

std::vector は非常に使いやすく、利用可能なドキュメントがたくさんあります。http://en.cppreference.com/w/cpp/container/vectorを参照してください

std::vector<int> qux;

qux.push_back(6);

void foo(std::vector<int>& bah)
{

}

配列を渡す必要がある場合は、少なくとも std::array を使用する必要があります 。http://en.cppreference.com/w/cpp/container/arrayを参照してください。

エラー

std::bad_alloc は、 new 演算子が失敗したときにスローされる例外です

new でその例外をスローさせたくない場合は、std::nothrow を使用できます。http://en.cppreference.com/w/cpp/memory/new/nothrow を参照してください

これを受け取っている理由は、初期化されていない変数を渡しているためです

于 2013-03-28T16:35:49.147 に答える