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
- 【c/c++】函数模板和模板函数
- 【c++】函数模板的简单应用
- [C++] 冒泡排序的模板函数设计
- C/C++ 函数模板
- c++:函数模板
- 【C++】函数模板
- 【c++】函数模板
- C语言函数模板
- C++:函数模板
- 【C++】模板函数总结!!!
- C的宏定义实现模板函数——C的C++模板函数机制实现
- C/C++:函数模板与类模板
- [C/C++]模板函数与模板类
- c++ 模板函数的一处小坑
- 用汇编的眼光看c++(之模板函数) ,(之缺省模板、特化模板) .
- c语言模拟模板的函数的方法
- 学习C++模板---模板函数
- Linux C/C++ 模板:函数模板
- 图像旋转算法的实现
- 机器学习中的数学(1)-回归和梯度下降
- Kia's Calculation(贪心)
- sikuli轻松完成新版IPC字幕设置的自动化测试
- Ubuntu中完全卸载Nginx
- c++ 模板函数的一处小坑
- 含有EditText,屏蔽系统软键盘
- 鼠标事件
- 第六十题(在O(1)时间内删除链表结点)
- xmpp mina模型线程池
- eclipse 配置 C++ 11 -- ubuntu 12.04
- Oracle:ORA-00001 违反唯一约束条件
- 21个免费的UI界面设计工具、资源及网站
- 用"再生龙"Clonezilla 来克隆Linux系统