malloc 与 new

  • malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。

  • 调用free函数时,它将用户释放的内存块连接到空闲链上。free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容是未定义的。

  • 如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

  • 关于函数使用需要注意的一些地方:

    • 申请了内存空间后,必须检查是否分配成功。
    • 当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
    • 这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
    • 虽然malloc()函数的类型是(void*),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。
int main(int argc, char *argv[])
{
    int n=100;
    while(1)
    {
        int *p = new int[n];
        //int *p = (int *)malloc(n*sizeof(int));
        for(int i=0;i<n;i++)
        {
            p[i] = i;
            qDebug()<< p[i];
        }
        delete[] p;
        //free(p);
    }
}

猜你喜欢

转载自blog.csdn.net/robothj/article/details/79996273