2014-12-02 2 views
-1

У меня есть класс «Сетка», который объявляет двумерный массив указателей на объекты класса «Ячейка» как свойство. Когда я создаю объект «Grid», который я вижу в отладчике, код конструктора, который инициализирует массив, вызывающий «новый Cell (p1, p2)» внутри цикла, создает указатели на ячейки, которые лежат внутри выделения для массива, таким образом искажая массив указателей.C++ выделяет ранее зарезервированную память при использовании нового конструктора Obj2() в Obj1?

Вот некоторые выдержки из кода:

class Cell { 
    public: 
     Cell(int a, int b); 
} 
class Grid { 
    public: 
      Grid(); 
      Cell * g[6][7]; 
} 

// code: 

Grid::Grid() { 
    // g is allocated to address x'13d1-19b8 (extending for 42*4=168 bytes) 
    for (int r=0; r<6; r++) 
    { 
     for (int c=0; c<7; c++) 
     { 
      g[r][c] = new Cell(r, c); // g[0][0] now contains x'13d1-19d8 which is INSIDE g[][] !?!?! 
     } 
    } 
..... 
} 

Может кто-нибудь сказать мне, что происходит или что я делаю не так?

+0

Что такое конструктор для 'Cell'? – CoryKramer

+1

Нарушение правила трех (пять C++ 11), избежание многомерных массивов –

+0

С целью поиска ошибки я сменил конструктор ячейки на: Cell :: Cell (int r, int c) { { row = r; col = c; } где row и col являются свойствами Cell – Mark

ответ

0

Я перестроил проект по частям, пытаясь описать, какая часть кода вызывает коррупцию. Однако я не смог воспроизвести ошибку. Теперь у меня есть то, что выглядит на мой взгляд идентичной копией исходного кода, и все работает отлично. (Исходный все еще не удается.) Не вижу, где я совершил ошибку в первой попытке, но я счастлив, что смогу прогрессировать.

Благодаря тем (@Cameron), который пытался помочь, и, может быть, когда-нибудь @Dieter объяснит мне, почему он вниз проголосовал мой вопрос ...;)