2

私は頻繁に行列を作成して作成する必要があるため(ポインターを使用する必要があります)、C ++で関数を作成してそれらにスペースを割り当て、最後の値がNULLに設定されていることを確認します。アプリケーションは、特定の場合にこのエラー(glibcが検出されました:メモリの破損)をドロップします。コードは次のとおりです。

template<typename T> T *allocate(int size) {
    T *temp = new T[size];
    temp[size] = (T) NULL;
    return temp;
}

これは機能します:

unsigned char *tmp = allocate <unsigned char> (10);

しかし、これはエラーを落とします:

unsigned char **tmp = allocate <unsigned char *> (10);

これは、次と同等になります。

unsigned char **tmp = new unsigned char *[10];
tmp[10] = (unsigned char *) NULL;

どっちがいい。なぜこのエラーが発生するのでしょうか。

更新:回答ありがとうございます。私はとても盲目です。これは1つのバグです。しかし、クラッシュの問題はコードの別の部分からでしたが、配列の割り当てられたスペースの外にNULLを追加していたためでもありました。

4

2 に答える 2

4

あなたはこれを行うことはできません:

temp[size] = (T) NULL;

この場合のサイズは、最後に割り当てたメモリ位置の後にインデックスを付けているため、次のように変更します。

temp[size-1] = (T) NULL;
于 2012-10-16T20:20:44.253 に答える
2

temp[size] = (T) NULL;

未割り当てメモリに割り当てています。

 T *temp = new T[size];

temp[0] から temp[size-1] に割り当てます

于 2012-10-16T20:20:45.570 に答える