0

私は次のような機能を持っています

template <class Type>
myFunc(Type** arrayToBeFilled);

私はそれをこのように呼びます:

double* array = NULL;
myFunc(&array);

そして、関数内で、strtod関数を使用して数値の読み取りと解析を行います。

//ここでファイルを開き、すべての行の行数と倍精度浮動小数点数を取得します

...
    char *inputString = new char[LONG_STRING_SIZE]; 
    char *pNext = NULL;
   (*arrayToBeFilled) = new Type[length*rowSize];

for (int i=0; i<length; i++)
    { 
        source.getline(inputString, LONG_STRING_SIZE);
        pNext = NULL;

     for (int j=0; j<rowSize; j++)
     {
         double d = strtod(inputString, &pNext);
        (*arrayToBeFilled)[i*rowSize+j] = d;
        inputString = pNext;
        pNext = NULL;
     }
    }

変数dはデバッガーで確認するためのものであり、実行中は問題ありません。しかし、配列を埋めた後、私はそれを印刷しようとします(チェックのためだけに)

for (int i=0; i<length; i++)

    {
        for (int j=0; j<rowSize; j++)
            {
                cout<<(*arrayToBeFilled)[i*rowSize+j]<<"  ";
            }
        cout<<"\n";
    } 

そして、ここに悪い出力があります-他の数値、時にはヒープの破損など。関数の内外で印刷していました-同じ結果です。そして、私はこの配列を削除することはできませんし、関数を削除することもできません-実行時エラーが私に続きます!

4

2 に答える 2

2

なぜC++で生のC配列を使用するのですか?rawの代わりにのようなSTLクラスを使用すると、コードがよりクリーンになり、読み取りと保守が簡単になります(たとえば、明示的な呼び出しは必要ありません。デストラクタがヒープメモリをクリーンアップします)。一般に、最近のC ++では、ルールは「新規作成または削除を行う場合、それを間違って行う」(一部の例外を除く)です。std::vectornew[]delete[]

vectorまた、C ++ 11の移動セマンティクスでは、出力参照/ポインター引数を使用する代わりに、単に返すことができることにも注意してください。

template <typename Type>
inline std::vector<Type> myFunc()
{
    ...
}

コードではなく、関数本体の内部

(*arrayToBeFilled) = new Type[length*rowSize];

書くだけ:

std::vector<Type> arrayToBeFilled(length*rowSize);

そして単にreturn arrayToBeFilled;

vector'sは一緒にネストできることにも注意してください。2D配列を作成するために使用することもできますが、これは、生の呼び出しに直接マップされるvector<vector<Type>>単一の配列よりも効率的ではありません。)vector<Type>new[]

さらに、投稿したコードで、ヒープ上に生のC配列を作成し、new char[LONG_STRING_SIZE]それにポインタを割り当てますinputString。次に、:inputStringからの割り当てで変更しますpNextが、そうすることで、ポインタがに格納されている初期配列をリークしますinputString

于 2012-05-28T09:26:04.073 に答える
1

返品タイプがないようです

template <class Type>
void myFunc(Type** arrayToBeFilled);

関数を初期化する必要があります

double array = NULL;
myFunc<double>(&array);

また、入力に関しては、取得した値を印刷してください。多くの場合、予期しない何かが発生してエラーが発生する可能性があります。

于 2012-05-28T08:53:18.373 に答える