0

私はC ++にまったく慣れていないので、Javaの配列として(主に便利な長さフィールド用に)本質的に機能する単純な汎用(これが適切な用語かどうかはわかりません)配列クラスを試してみたいと思いました。すべてのコードは次のとおりです。

#include <iostream>


template <typename T>
class Array
{
private:
    T* ar;
public:
    const unsigned int length;

    Array(unsigned int length_) : length(length_), ar(new T[length]) {}
    void insert(unsigned int, T);
    T& get(unsigned int);
    T& operator[](unsigned int);
};

template <typename T> void Array<T>::insert(unsigned int index, T dataToAdd)
{
    if(index>=length)
        {throw -1;}
    ar[index]=dataToAdd;
}

template <typename T> T& Array<T>::get(unsigned int index)
{
    if(index>=length)
        {throw -1;}
    return ar[index];
}

template <typename T> T& Array<T>::operator[](unsigned int index)
    {return this->get(index);}


int main()
{
    std::cout << "main start\n";

    Array<int> nums1=Array<int>(2);
    nums1[0]=4;
    nums1[1]=10;
    std::cout << "length of nums1:" << nums1.length << "\n";    

    Array<int> nums2=Array<int>(2);
    nums2[0]=8;
    nums2[1]=5;
    std::cout << "length of nums2:" << nums2.length << "\n";

    Array<int> nums3=Array<int>(2);
    std::cout << "nums3 created\n";
    nums2[0]=3;
    std::cout << "added to index 0\n";
    nums2[1]=15;
    std::cout << "added to index 1\n";
    std::cout << "length of nums3:" << nums3.length <<"\n";

    std::cout << "main end\n";
}

(MinGWを使用して)問題なくコンパイルされますが、実行すると次の出力が得られます。

main start
length of nums1:2
length of nums2:2
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

最後に出力されるのは nums2:2 の長さなので、cout行で例外がスローされると想定します。Array<int> nums3=Array<int>(2);

これの理由は何ですか?記憶がなくなるわけがないじゃないですか。

4

1 に答える 1

3

初期化行の順序に関係なく、メンバー変数はクラスで宣言された順序で初期化されます。したがって、これ:

private:
    T* ar;
public:
    const unsigned int length;

arの前に初期化されることを意味するlengthため、次のようになります。

Array(unsigned int length_) : length(length_), ar(new T[length]) {}

length施工前に使用しています。メンバー変数のクラス decl-order を変更するかlength_、の構築で使用しarます。

于 2014-06-13T09:30:06.070 に答える