Цитата(Royan @ 25.2.2006, 16:56 ) | Daevaorn, Мне казалось, что в любом массиве элементы располагаются друг за другом. А можешь объяснить, в чем отличие динамического массива от статического с физической точки зрения, откуда там возникает утечка? |
В двухмерном массиве, созданом не динамически, члены массива идут один за другим. Пример:
Код | char ch[2][2]={"c","a"};
|
Вот вырезка, как этот массив разместился у меня в памяти:
Цитата | 0012FF7C 63 00 61 00
|
Теперь расмотрим динамический массив. В первую размерность записываются не данные, а адреса на вторую размерность. Во второй размерности уже записываются сами данные. Пример:
Код | char **ch=new char *[2]; for (int i=0; i<2; i++) ch[i]=new char[2]; ch[0][0]='c'; ch[0][1]=0; ch[1][0]='a'; ch[1][1]=0;
|
После выполнения в самой переменной ch был записан адрес на выделенную память.
Цитата | 00322908 50 29 32 00 98 29 32 00
|
Это так выгледела первая размерность. Так выгледит вторая размерность
Цитата | 00322950 63 00 00322998 61 00
|
Если ты даеш memset для двухмерного динамического массива в твоем случае, то ты просто напросто затираеш ссылки на вторую размерность. И последуюшие попытки обрашения ко второй размерности должны привести к вылету программы. Добавлено @ Добавлено @ 18:48 Если ты хочеш обнулять вторую размерность, нужно делать
Код | for(int i = 0; i < col - 1; i++) { memset(mx[i],0, sizeof(double)*row); }
|
|