C++ , 动态指针数组作为类的成员,如何分配空间

C++类中,有一个成员是动态指针数组,TYPE**arr;intsize;数组arr[size]里德元素是指向TYPE的指针TYPE*。size是个变量。怎么初始化这个成... C++ 类中,有一个成员是动态指针数组,TYPE** arr; int size;
数组 arr[size] 里德元素是指向TYPE的指针TYPE*。size是个变量。

怎么初始化这个成员,关键是怎么给它分配空间?还有怎么delete 它产生的资源。

是不是
for(int k =0; k < size; k++)
{
arr[k] = new TYPE;
}
arr = new TYPE*[size];

delete 的时候就是先循环delete arr[k];再delete arr;
to dongyue2008 :
我这样做,但是在应用时给arr[k赋值时为出现读取错误。

是不是空间分配有问题?

to shark_8309 :
实现的时候我是放在前面的。

分配空间时,关键是size的默认初始化是一个很大的数。
而如果size初始化为0 的话,之后的[k]分配又会有问题。
在另一个类中调用时会出现“out of memory ”,分配内存过多的问题。
展开
 我来答
shark_8309
2011-01-15 · TA获得超过1024个赞
知道小有建树答主
回答量:356
采纳率:0%
帮助的人:289万
展开全部
dongyue2008的程序没错呀。
问题是不是在这里,你的程序:
for(int k =0; k < size; k++)
{
arr[k] = new TYPE;
}
arr = new TYPE*[size]; //这个是应该放在前面的
把两个部分写反了,结果arr被赋值到一个新的地址,内容是三个不确定的int指针地址,于是赋值的时候就出错了
dongyue2008
推荐于2016-02-10 · TA获得超过3605个赞
知道大有可为答主
回答量:1300
采纳率:100%
帮助的人:629万
展开全部
在构造函数中分配空间:
arr = new TYPE*[size];
for(int k=0; k<size;k++)
arr[k] = new TYPE;
在析构函数中回收资源:
for(int k=0;k<size; k++)
delete arr[k];
delete []arr;

再来一个示例:
#include <iostream>
using namespace std;
int main()
{
int ** arr;
arr = new int* [3];
for (int k=0; k<3; k++)
{
arr[k] = new int;
cin>>*arr[k];
}
for (int k=0; k<3; k++)
cout<<*arr[k]<<" ";
cout<<endl;

for (int k=0; k<3; k++)
delete arr[k];
delete []arr;

return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
传薪网络
推荐于2016-06-30 · TA获得超过1355个赞
知道小有建树答主
回答量:635
采纳率:92%
帮助的人:256万
展开全部

  采用逐级分配的方式进行分配,从顶级开始分配,再分配子级

  释放的时候采用逐级释放,从子级开始释放,再释放顶级

  示例代码如下:

class test{
public :
    int size;
    TYPE** attr;
    test(){
        size=0;
        attr=NULL;
    }
    ~test(){
        if(size>0 && attr != NULL)
        {
            for(int i=0;i<size;i++){//先遍历子级,释放子级内存
                delete attr[i];
                attr[i] = NULL;
            }
            delete[]attr;//释放顶级内存
            attr = NULL;
            size = 0;
        }
    }
    void alloc(int k){
        attr = new TYPE*[k];//先分配顶级内存
        for(int i=0;i<k;i++){
            attr[i] = new TYPE;//再分配子级内存
        }
        size = k;
    }
}

  多维数组内存分配可以采用逐级分配的方式,自顶向下进行

  多维数组析构内存可以采用逐级析构的方式,自底向上进行

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wadehan1234
2015-11-04
知道答主
回答量:15
采纳率:0%
帮助的人:11.4万
展开全部
  1. C++中的数组一旦声明,就是固定长度的。所以你可以用int i_arr[256];这样的写法来作为类的成员。

  2. 如果你的数组要是“动态”的,也就是在类对象运行期变化长度,建议你使用stl的vector等容器。

  3. 如果你不想使用容器,你也可以定义一个int* ptr_i_arr;使用一个指针来记录你在堆中的new的数组的首地址。

方案2,容器的数据是放在堆上的,但是容器对象会自动在析构时释放所占用的空间。

方案3,其数组内容实际上都放在堆上,而不会被包含在类对象内部,因此也不会被自动的释放,你需要在析构器里手动释放。

如果你的动态数组不是元素非常多(好几万),建议使用方案2,代码简洁且容易维护。

如果你的动态数组有一个不大的逻辑上限,可以使用方案1,另外加一个count成员记录数组长度即可。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pythonlua
2011-01-15
知道答主
回答量:20
采纳率:0%
帮助的人:16.5万
展开全部
TYPE** p=new TYPE*[size];
for(int i=0;i<size;i++)
{
p[i]=new TYPE;
}
// delete
for(int j=0;j<size;j++)
{
delete p[j];
}
delete[] p;
关键理解点: TYPE* 等同于一个类型,就像TYPE一样使用,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式