C++三维数组空间释放问题 5C
 // 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; \

4个回答

您这传值有问题啊,您把指针作为一个值传递给了函数,实际上使用的是复制传值,而不是传地址,自然无法释放了。
三维数组通过函数释放,应该传递一个该数组指针的指针进去,也就是传递指针的地址。

Kiloveyousmile
Kiloveyousmile 回复guyuealian: 请看下面的回复
大约 2 年之前 回复
guyuealian
pan_jinquan 亲,那需要怎么改呢?
大约 2 年之前 回复

应该已经释放了,没有问题。不知道你的里外不同指什么。
加上指针输出

 // 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;
}

feelcycle_07
默默悟问 我把delete的顺序改了。
大约 2 年之前 回复

输出

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

feelcycle_07
默默悟问 前后两个列表正好逆序对应,外部的p3和里面的也是一致的。释放直接传指针值就可以,安全起见main里释放后要置p3为NULL
大约 2 年之前 回复

补充:将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;
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐