动态数组分配内存

来源:互联网 发布:php高级开发工程师 编辑:程序博客网 时间:2024/05/06 02:02

#include"stdlib.h"
#include"stdio.h"

main()
{
int i,size;
int *pa;
pa=(int *)malloc(sizeof(int)*size);
for(i=0; i<ARRAY_SIZE; i++,pa++)
{
   *pa=i;
   printf("%d",*pa);

}
}            
改进--动态分配数组可以写一个函数

#include <stdlib.h>
#include <stdio.h>
init(int **block,int siz)
{
     int *aux;
     if((aux=(int *)malloc(siz*sizeof(int)))==NULL) return 0;
     printf("请输入%d整数的值:/n",siz);
    *block=aux;
     while(siz--)
         scanf("%d",aux++);

     return 1;
}
main()
{
     int *arr,i,size;
     printf("数组的大小:");
     scanf("%d",&size);
     if(!init(&arr,size)){
         printf("不能分配内存/n");exit (0);
     }
     for(i=0;i<size;i++)
         printf("%d/n",arr[i]);
}

说明:

(1)首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中是 cstdlib),而不是 malloc.h 。因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件。但是所有的 C 编译器都应该有 stdlib.h 这个头文件。

(2)在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不能通过编译。但是在 C 中,这种强制转换却是多余的,并且不利于代码维护。
(3)c语言与c++的区别--
动态分配与释放

c语言
int *a=(int *)malloc(i*(sizeof(int));
c++语言
int *a=new int[i];

用完都要记得释放哦
c语言释放
free(a)
c++语言释放
delete a;或者delete []a;

具体问题讨论

我用 int *ptr=new int[10];   申请了空间,
    但删除时用 delete ptr;
还是
delete []ptr;   

C++中规定数组指针必须用delete[]删除,这我当然知道。
但我想说的是楼上诸位中,除了wuchuncai外,有谁亲自去试过两者的区别,
又有谁能说出为什么要用delete[]而不是delete(不要总告诉我书上是这么说的)。
因为删除一个指针只要知道一个指针地址就行了,如 free(p)等函数,并不需要知道
其它的信息。因此,单纯从删除内存的角度上说,delete p 和 delete[] p 的效果是一
样的。唯一的区别,就是一个只调用了一次析构函数,一个对数组中的每个对象调用了一次析
构函数。 因此,对于new int[10]这样的简单类型,两者的作用是一样的,而对类就不一样了。

delete ptr 用来释放内存,且只用来释放ptr指向的内存。
delete[] rg 用来释放rg指向的内存,!!还逐一调用数组中每个对象的destructor!!
对于象int/char/long/int*/struct等等简单数据类型,由于对象没有destructor,所以用delete 和 delete[]是一样的!但是如果是C++对象数组就不同了!

////////////////*****************************//////////////////////////////

delete和delete [] 都可以把空间完全的释放(因为该指针空间的大小已知),
差异在于调用类数组的析构函数上。

class C1
{
~c1();
}
C1 * pA;
pA=new C1[10];
则delete pA,释放了全部空间,但只调用了C1[0]的析构函数
delete []将调用全部C1[0]~C1[9]的析构函数。
这在带有指针成员的类处理时,有很大的关系,前者会带来内存泄漏。
其实[]就是告诉系统,释放的是一个数组(多个元素).  
////////////////*********************///////////////////

        malloc应该不会调用构造函数
free也不会调用析构函数
这是malloc与new的唯一区别
我想应该是这样吧

///////////////*******************///////////////////

1. 编译器对于删除数组时数组的大小的计算有不同的方法,有的在数组前或后附加一些字节,有的内部保持指针和长度的map,不配对使用可能会破坏编译器生成的内部数据。

2. new[]/new,delete[]和delete是不同的操作符,可以分别重载,重载要保证new/delete互逆,new[]/delete[]互逆,但new/delete[]或new[]/delete就不一定保证了。如果这些操作符被重载过,那么用错的话,错误会不可预料。

所以,不论是对象数组还是简单类型的数组,new/delete,new[]/delete[]的配对*绝对*不能搞错,不要依赖于一种编译器的实现。  

/////////////**********************/////////////////////

ken88已经讲的很清楚了,我认为没有必要再讨论了。即然C++提供了new和delete操作符,我们就应当遵守C++的规则。因为C++的标准这么定了,完全有可能有一个编译器必须用delete[]删除申请的数组,不管它的元素是标准类型还是类的实例。能作成好软件的关键不是靠当事人聪明,而要靠遵守规则,印度人就是这么作的,不要把时间浪费在小聪明上。如果有一天我们不用M$的VC了,我们的程序怎么改?(MFC是好改的,相信诸位有不少有能力将MFC移值到别的平台的)象delete[]这样的问题,不仅是移值的问题,它根本就是个错误,一个概念上的错误!

/////////////******************////////////////