// MaxMinDisTest.cpp :
#include "stdafx.h"
#include <iostream>
using namespace std;
inline int *** newArray3(int row, int col,int cha){
int *** p3;
p3 = new int**[cha];
for (int i = 0; i < cha; i++) {
p3[i] = new int*[row];
for (int j = 0; j < row; j++)
p3[i][j] = new int[col];
}
return p3;
}
inline void initArray3(int ***p3, int row, int col,int cha,int value=0) {
for (int i = 0; i < cha; i++)
for (int j = 0; j < row; j++)
for (int k = 0; k < col; k++)
p3[i][j][k] = i;
}
inline void printArray3(int ***p3, int row, int col, int cha) {
cout << "[";
for (int i = 0; i < cha; i++)
{
cout << "[";
for (int j = 0; j < row; j++)
{
for (int k = 0; k < col; k++)
cout << p3[i][j][k] << ' ';
cout << endl;
}
cout << "]"<<endl;
}
cout << "]" << endl;
}
inline void deleteArray3(int ***p3, int row, int col, int cha) {
for (int i = 0; i < cha; i++) {
for (int j = 0; j < row; j++) {
delete[]p3[i][j];
}
delete[]p3[i];
}
delete[]p3;
}
int main(void)
{
int row = 5, col = 4, cha = 3;
/*********************** 动态定义三维数组 ******************************/
int *** p3 = newArray3(row, col, cha);//
initArray3(p3,row,col,cha);//赋值
printArray3(p3, row, col, cha);//打印输出结果
deleteArray3(p3, row, col, cha);//想利用一个函数释放new空间,这里没有释放成功,因为调试发现里外指针p3指向不同
return 0;
}
我的问题是:上面的程序deleteArray3函数用于释放三维数组空间,显然这是没有成功释放的,请问该如何使用一个函数释放new空间?
难道只能采用宏定义的方式麽:
#define deleteArray3(p3, row, col, cha) \
for (int i = 0; i < cha; i++) { \
for (int j = 0; j < row; j++) { \
delete[]p3[i][j]; \
} \
delete[]p3[i]; \
} \
delete[]p3; \
您这传值有问题啊,您把指针作为一个值传递给了函数,实际上使用的是复制传值,而不是传地址,自然无法释放了。
三维数组通过函数释放,应该传递一个该数组指针的指针进去,也就是传递指针的地址。
应该已经释放了,没有问题。不知道你的里外不同指什么。
加上指针输出
// MaxMinDisTest.cpp :
#include "stdio.h"
#include <iostream>
using namespace std;
inline int *** newArray3(int row, int col,int cha){
int *** p3;
p3 = new int**[cha];
cout << p3 << endl;
for (int i = 0; i < cha; i++) {
p3[i] = new int*[row];
cout << p3[i] << endl;
for (int j = 0; j < row; j++) {
p3[i][j] = new int[col];
cout << p3[i][j] << endl;
}
}
return p3;
}
inline void initArray3(int ***p3, int row, int col,int cha,int value=0) {
for (int i = 0; i < cha; i++)
for (int j = 0; j < row; j++)
for (int k = 0; k < col; k++)
p3[i][j][k] = i;
}
inline void printArray3(int ***p3, int row, int col, int cha) {
cout << "[";
for (int i = 0; i < cha; i++)
{
cout << "[";
for (int j = 0; j < row; j++)
{
for (int k = 0; k < col; k++)
cout << p3[i][j][k] << ' ';
cout << endl;
}
cout << "]"<<endl;
}
cout << "]" << endl;
}
inline void deleteArray3(int ***p3, int row, int col, int cha) {
for (int i = cha-1; i >= 0; i--) {
for (int j = row - 1; j >= 0; j--) {
cout << p3[i][j] << endl;
delete[] p3[i][j];
}
cout << p3[i] << endl;
delete[] p3[i];
}
cout << p3 << endl;
delete[] p3;
}
int main(void)
{
int row = 5, col = 4, cha = 3;
/*********************** 动态定义三维数组 ******************************/
int *** p3 = newArray3(row, col, cha);//
cout << "p3:" << p3 <<endl;
initArray3(p3,row,col,cha);//赋值
printArray3(p3, row, col, cha);//打印输出结果
deleteArray3(p3, row, col, cha);//想利用一个函数释放new空间,这里没有释放成功,因为调试发现里外指针p3指向不同
return 0;
}
输出
0x7f8679702b10
0x7f86794269d0
0x7f8679425fa0
0x7f8679425d40
0x7f8679425bd0
0x7f8679425740
0x7f8679425550
0x7f8679426710
0x7f8679425220
0x7f8679424e20
0x7f8679424cf0
0x7f8679424d20
0x7f8679407b20
0x7f8679406f20
0x7f8679406220
0x7f8679406130
0x7f8679400220
0x7f86794061c0
0x7f86794061d0
p3:0x7f8679702b10
[[0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
]
[1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
]
[2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
]
]
0x7f86794061d0
0x7f86794061c0
0x7f8679400220
0x7f8679406130
0x7f8679406220
0x7f8679406f20
0x7f8679407b20
0x7f8679424d20
0x7f8679424cf0
0x7f8679424e20
0x7f8679425220
0x7f8679426710
0x7f8679425550
0x7f8679425740
0x7f8679425bd0
0x7f8679425d40
0x7f8679425fa0
0x7f86794269d0
0x7f8679702b10
补充:将deleteArray3
函数修改为:
inline void deleteArray3(int ****p3, int row, int col, int cha) {
for (int i = 0; i < cha; i++) {
for (int j = 0; j < row; j++) {
delete[]*p3[i][j];
}
delete[]*p3[i];
}
delete[]*p3;
}
测试部分
int main(void)
{
int row = 5, col = 4, cha = 3;
/*********************** 动态定义三维数组 ******************************/
int *** p3 = newArray3(row, col, cha);//
initArray3(p3,row,col,cha);//赋值
printArray3(p3, row, col, cha);//打印输出结果
deleteArray3(&p3, row, col, cha);//想利用一个函数释放new空间,这里没有释放成功,因为调试发现里外指针p3指向不同
cout<<"p3[0][0][0]:"<<**p3;
return 0;
}