c++ 模板函数的一处小坑

来源:互联网 发布:vnr网络连接不畅 编辑:程序博客网 时间:2024/04/26 08:23

今天心血来潮写个创建和析构二维数组的模板函数,可是万万没想到掉进坑里面

#include <iostream>#include <cstdio>template<typename T>bool init2DArray(T **  ,const int &, const int &, const T & = 0);template<typename T>void destroy2DArray(T **, const int &);int main(){    char **pCArr = NULL;    init2DArray(pCArr, 10, 3, 'a');    std::cout << "p Address : " << pCArr << std::endl;    for(int i = 0; i < 10; i ++)    {        for(int j = 0; j < 3; j ++)        {            printf("%d %d %d\n", i, j, pCArr[i][j]);        }    }    destroy2DArray(pCArr, 10);    system("pause");}template<typename T>bool init2DArray(T **  pArr, const int & row, const int & col, const T & defaultV){    destroy2DArray(pArr, row);    pArr = new T * [row];    if(pArr != NULL)    {        for(int i = 0 ; i < row; i ++)        {            pArr[i] = NULL;            pArr[i] = new T [col];            if(pArr[i] != NULL)            {                for(int j = 0; j < col; j ++)                {                    pArr[i][j] = defaultV;                    printf("%d %d %d\n", i, j, pArr[i][j]);                }            }        }    }    std::cout << "p Address : " << pArr << std::endl;    return pArr == NULL ? 0 : 1;}template<typename T>void destroy2DArray(T ** pArr, const int & row){    if(pArr != NULL)    {        for(int i = 0; i < row; i ++)        {            if(pArr[i] != NULL)            {                delete []pArr[i];                pArr[i] = NULL;            }        }        delete []pArr;        pArr = NULL;    }}

心想万无一失的,可是在main函数内部使用二维数组的指针频频error,百思不得其解

所以我就打印出申请空间前后的指针地址,一看果断问题大了,创建之后的数组指针是0x0

于是乎,have a try,脑子不知道怎么想的,我就稍稍加了个引用,于是乎

#include <iostream>#include <cstdio>template<typename T>bool init2DArray(T ** & ,const int &, const int &, const T & = 0);template<typename T>void destroy2DArray(T **, const int &);int main(){    char **pCArr = NULL;    init2DArray(pCArr, 10, 3, 'a');    std::cout << "p Address : " << pCArr << std::endl;    for(int i = 0; i < 10; i ++)    {        for(int j = 0; j < 3; j ++)        {            printf("%d %d %d\n", i, j, pCArr[i][j]);        }    }    destroy2DArray(pCArr, 10);    system("pause");}template<typename T>bool init2DArray(T ** & pArr, const int & row, const int & col, const T & defaultV){    destroy2DArray(pArr, row);    pArr = new T * [row];    if(pArr != NULL)    {        for(int i = 0 ; i < row; i ++)        {            pArr[i] = NULL;            pArr[i] = new T [col];            if(pArr[i] != NULL)            {                for(int j = 0; j < col; j ++)                {                    pArr[i][j] = defaultV;                    printf("%d %d %d\n", i, j, pArr[i][j]);                }            }        }    }    std::cout << "p Address : " << pArr << std::endl;    return pArr == NULL ? 0 : 1;}template<typename T>void destroy2DArray(T ** pArr, const int & row){    if(pArr != NULL)    {        for(int i = 0; i < row; i ++)        {            if(pArr[i] != NULL)            {                delete []pArr[i];                pArr[i] = NULL;            }        }        delete []pArr;        pArr = NULL;    }}

顿时脑洞大开,习惯了对二维数组操作使用指针,忘记了指针只是名字而不是人的事实

0 0