2017-10-30 4 views
1

を読まれた後に1になり、私は、コードの非常に簡単かつ最低限の部分を実行している:C++ - 配列の値がそう

template <typename T> 
matrix<T>::matrix(int r, int c, int a) 
{ 
    int data2[6*4] = {-1, 12, 23, 34, 45, 56, 
        11, 22, 33, 44, 55, 66, 
        21, 32, 43, 54, 65, -1, 
        31, 42, 53, 64, -1, -1}; 

    mData = new T(6*4); 

    for(int p=0; p < 6*4; p++){ 
     mData[p] = T(data2[p]); 
     std::cout << " " << mData[p] << ":"; 
     std::cout << " " << mData[p] << ":" << std::endl; //second time is read 
    }; 

    for(int p=0; p < 4; p++){ 
     for(int p2=0; p2 < 6; p2++){ 
      if(mData[p2 + p * 6] == 1)std::cout << "FOUND ONE" << std::endl; 
     } 
    } 
} 

int main(){ 

    int i = 6; 
    matrix<int> b = matrix<int>(i,i, 0); 
} 

しかし、ランダムな間隔でデータの値がございます2回目に読み込み中に変更します。初めてのことではなく、常に第2のものです。ここにあなたの例があります:

-1: -1:                                 
12: 12:                              
23: 23:                             
34: 34:                             
45: 45:                               
56: 56:                             
11: 11:                             
22: 22:                             
33: 1:                             
44: 44:                             
55: 55:                             
66: 66:                             
21: 21:                             
32: 32:                             
43: 43:                              
54: 54:                             
65: 65:                             
-1: -1:                             
31: 31:                             
42: 42:                             
53: 53:                             
64: 64:                             
-1: -1:                             
-1: -1:                             
FOUND ONE                                                          
Process returned 0 (0x0) execution time : 0.085 s                  
Press any key to continue. 

構造には何も触れていないので、何が起こっているのか分かりません。番号は常に正しく保存されます(最初の印刷が常に正しいので)。その後は破損します...何が起こっているのか分かりません。どんな助け?

EDIT:見つけ

ソリューション、どうやら私は単純に「[]」「)(」のために、そしてオーバーと気づいたことはありません上のコードを見ているにもかかわらず、間違えました。 (それは後見で明らかです)。

ありがとうございます。このコード行で

+0

あなたのクラスが3のルールに従わないと思われ、あなたが実際に削除されたメモリにアクセスしています。 MCVEを投稿してください –

+0

私はあなたの 'mData'を正しく初期化していないと思います。私はあなたがこの場合単一の整数として初期化していると思うので、 'mData [p]'でオフセットして値を設定すると、その値は 'mData [p] 'それは予約されていません。たぶん 'std :: vector mData'ですか? – Engineero

答えて

3

mData = new T(6*4); 

Tの単一のインスタンスが割り当てられます。その後、コードはそれを配列としてアクセスしようとし、範囲外のアクセスにつながります。

mData = new T[6*4]; 

を編集し、別のヒント:これらのような誤差を低減するために、全体的なコードスタイルを改善するために、私はほとんど常にstd::vector<T>の代わりT*のために行く

それはおそらく、このように意図されていました要素の配列を作成するときに使用します。アクセスパターンはほとんど変わりませんが、メモリー管理について心配する必要はなく、コストをかけずに追加のボーナス方法を得ることができます。

+0

これは、「新」は初心者に教えられず、「プロのみ」の技術とみなされるべきです。 –

+2

@MooingDuck私はdiasgreeです。早く学び、正しく学びましょう。 :) – MFisherKDX

+0

@MooingDuck悲しいことに、私は何年もC++を使い続けてきたので、私は自分自身を初心者と考えています。 (初心者ではない)新しいことは、あなたがそれをどう扱うべきか分からなければ、有毒になる可能性があることに同意する。しかし、パフォーマンスを重視してコードを作成する必要があるため、いつメモリを作成するかを制御することは非常に便利です。 – NacOverflow

関連する問題