Динамическое создание двумерного..
Вот код который создает все это
void CreateMatrix(unsigned int*** ptrMatrix, long Rows,long Colls)
{
*ptrMatrix=new unsigned int*[Rows];
for(long iRow=0;iRow!=Rows;iRow++)
{
*ptrMatrix[iRow]=new unsigned int[Colls];
}
}
Динамическое создание двумерного массива, не могу понять почему ругается Access Violation.
Вот код который создает все это
void CreateMatrix(unsigned int*** ptrMatrix, long Rows,long Colls)
{
*ptrMatrix=new unsigned int*[Rows];
for(long iRow=0;iRow!=Rows;iRow++)
{
*ptrMatrix[iRow]=new unsigned int[Colls];
}
}
В языке C++ суфикс имеет больший приоритет, чем префикс. Т.о. в данном случае надо писать так:
(*ptrMatrix)[iRow]=new unsigned int[Colls];
Вопрос: а зачем вводиться аргумент ptrMatrix ? Мне кажется, что это совсем не нужно, а иногда опасно. IMHO так правильнее:
unsigned int** CreateMatrix(long Rows,long Colls)
{
unsigned int** ptrMatrix=new unsigned int*[Rows];
for(long iRow=0;iRow!=Rows;iRow++)
{
ptrMatrix[iRow]=new unsigned int[Colls];
}
return ptrMatrix;
}
А еще правильнее было бы создать соотв. класс.
Но я сделал по другому
typedef unsigned short** TMatrix;
void CreateMatrix(TMatrix& ptrMatrix, long& Rows,long& Colls)
{
ptrMatrix=new unsigned int*[Rows];
static long iRow=0;
for(iRow=0;iRow!=Rows;iRow++)
{
ptrMatrix[iRow]=new unsigned int[Colls];
fill(ptrMatrix[iRow],ptrMatrix[iRow]+Colls,0);
}
}
А насчет вашего варианта return ptrMatrix;
Въехать не могу в одно, почему указатель не уничтожается при выходе из функции, вроде при завершении блока все переменные объявленные в нем уничтожаются?
А насчет вашего варианта return ptrMatrix;
Въехать не могу в одно, почему указатель не уничтожается при выходе из функции, вроде при завершении блока все переменные объявленные в нем уничтожаются?
Указатель уничтожается, но функция возвращает его значение, создав временный соотв. объект. Этот временный объект будет жить до конца строки, где эта функция вызывалась. Это в теории С++, на практике же всё ещё проше: при выходе из функции, значение указателя (обычно) помещается в EAX, а далее это значение используется вызывавшим функцию кодом. Не возникает же вопрос: почему не уничтожается результат
DWORD func()
{
DWORD res = 5;
return res;
}