精华内容
下载资源
问答
  • 申请空间

    2017-11-01 20:00:17
     在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。 2)calloc 函数: void *calloc(unsigned int num, unsigned int...
    1) malloc 函数: void *malloc(unsigned int size)
    

         在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。

    2)calloc 函数: void *calloc(unsigned int num, unsigned int size)

         按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。

        calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。 
    3)realloc 函数: void *realloc(void *ptr, unsigned int size)

        动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。

        申请的内存空间不会进行初始化。
    4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
    展开全文
  • 申请空间 new、delete

    2018-11-27 14:53:25
     在C语言中,我们申请空间用malloc,calloc,realloc,释放空间为free,在这样的空间申请后,我们需要对申请空间的状态,进行判断,判断是否申请成功,并且需要对没有申请成功的变量进行处理,在这样的情况下,人们...

    new/delete 出现的背景:

            在C语言中,我们申请空间用malloc,calloc,realloc,释放空间为free,在这样的空间申请后,我们需要对申请空间的状态,进行判断,判断是否申请成功,并且需要对没有申请成功的变量进行处理,在这样的情况下,人们难免可能会忘记判断,导致程序出现异常。

    new/delete 实现的原理:

      new、delete ,new[] ,delete[], 在实现原理上依旧是调用C语言中的malloc 和 free 进行实现,但由于对malloc,free进行了调用,因此在内部,new对变量 申请的空间进行了判断,并且对没有申请成功的变量进行了处理。

    1.这是new在C++中的实现方式,其中  _THROW_NCEE(_XSTD bad_alloc, );这是对new  变量 抛出异常

              operator new()函数中可以添加其他的参数,但第一个参数必须是size_t类型的参数

    void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
            {       // try to allocate size bytes
            void *p;
            while ((p = malloc(size)) == 0)
                    if (_callnewh(size) == 0)
                    {       // report no memory
                            _THROW_NCEE(_XSTD bad_alloc, );
                    }
    
            return (p);
            }
    

    2.这是new[] 在C++中的实现,通过其中代码可见 主要是通过调用new 来创建一段连续的空间

    void * operator new[]( size_t cb )
    {
        void *res = operator new(cb);
    
        RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));
    
        return res;
    }
    

    3.这是delete 在C++中的实现,由此可见主要是调用free 来释放空间

    void operator delete( void * p )
    {
        RTCCALLBACK(_RTC_Free_hook, (p, 0));
    
        free( p );
    }
    

    4.

    void operator delete[]( void * p )
    {
        RTCCALLBACK(_RTC_Free_hook, (p, 0))
    
        operator delete(p);
    }

    new/delete操作自定义类型的次序:

    1.new:
            1).申请空间:void *__CRTDECL operator new(size_t size字节数) _THROW1(_STD bad_alloc) 
         
                表明依旧是使用C语言中的malloc申请空间,并且进行判断是否申请成功,没有成功,则在函数内部进行处理
                operator new()函数中可以添加其他的参数,但第一个参数必须是size_t类型的参数
                        
            2).调用构造 :对象初始化 
            
        2.delete :
            1).调用析构 :将对象中的资源释放掉
            2).释放空间:void operator delete(void *pUserData) 
                 调用从语言中的free释放空间

                 operator new/ operator delete  基本上不需要重载,除非需要看是在什么时候使用,并且申请多长字节等等信息或者需要查看内存泄漏的情形。
                 
        3.new T[N]:前四个字节(取决于是否有析构函数)放对象的个数。(目的:保证销毁时销毁对象的次数)
    小贴士:这里面申请空间大小有没有多申请4个字节,取决于类成员函数中是否存在析构函数或者编译器是否默认生成析构函数。若类成员函数中没有析构函数,则申请空间时,不多申请4个字节。
            1).operator new[](sizeof(T)*N+4)
                operator new(sizeof(T)*N+4)
                    while(p=malloc(字节数)==NULL))
                    {     if(条件(空间不足的处理))
                            { 抛异常}
                            }
            2).调用N次构造对象:
            
        4.delete[] p:
            1).调用N次析构函数-->释放每个对象的资源,后构造的先析构,成对出现
            2).operator delete[](void* p)-->operator delete(p)--->free(p)

    注意:

    1. new 和 delete 是C++中提出的关键字,不是函数
        2.new 类型,可以初始化,无需强制类型转化
        3.new申请的空间不需要对结果判空(原:
        4.new申请空间  -->会调用构造函数   delete--->调用析构函数
            malloc 不调用构造函数    free 不调用析构函数
            new/delete   new[]/delete[]   malloc/free :匹配使用
              否则:内存泄漏、崩溃

    小问题:若申请空间与释放空间没有匹配使用,则程序会出现什么样的问题?

    答:1.内置类型:如果没有匹配使用,程序也不会出问题--但建议:匹配使用
            #include<srtdbg.h>
            _crtdumpMemoryLeak()函数:检测是否存在内存泄漏
        2.自定义类型出问题:1.内存泄漏  2.程序崩溃

    展开全文
  • 程序中需要用到一个int型数组,数组元素个数750000000个,用new内存不足,分成了10份存储还是内存不足。想问下对于大数组应该如何申请空间存储?
  • 给二维数组申请空间

    2020-10-18 17:18:46
    使用malloc函数来给二维数组申请空间 在使用C语言的时候malloc函数可以说是一个比较好用的工具。 #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { int **data,i,j; int ...

    使用malloc函数来给二维数组申请空间
    在使用C语言的时候malloc函数可以说是一个比较好用的工具。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int main()
    {
         int **data,i,j;
         int row=5,column=10;//申请一个五行十列的int行的二维数组
         data=(int **)malloc(sizeof(int *)*row);
         for(i=0;i<row;i++)
         {
             data[i]=(int *)malloc(sizeof(int)*column);
             memset(data[i],0,sizeof(int)*column);
         }
         for(i=0;i<row;i++)
         {
             for(j=0;j<column;j++)
                printf("  %d  ",data[i][j]);
             printf("\n");
         }
    }
    
    

    代码比较简单不做过多的解释了

    展开全文
  • c++动态申请空间

    2014-06-14 17:20:08
    使用new申请空间: 特点:  1、没有名字,只能通过指针间接访问它们。  2、从堆中申请空间 分类: 变量:  语法:指针变量 = new 类型名;  Delete 指针变量  举例:int *p;  

    使用new申请空间:

    特点:

            1、没有名字,只能通过指针间接访问它们。

            2、从堆中申请空间

    分类:

    变量:

              语法:指针变量 = new 类型名;

                          Delete 指针变量

              举例:int *p;

                          p=new int;

                          delete p;

              初始化:

                           *p=90;

                           p=new int(99);

    一维数组:

               语法:指针变量 = new 类型名[下标表达式]; 下标表达式是整型常量或整型表达式

                           Delete [ ]指针变量;---[ ]表明是个数组,但不需要指出其大小

               举例:Int *p;

                           P= new type[s];

                           Delete [ ]p;

    多维数组(二维数组):  必须指出所有维的长度

               语法:指针变量 = new 类型名[下标表达式] [下标表达式];

                           Delete [ ]变量名

               举例:定义一个3×4的数组

                           Int (*p)[4]; p是个指针,它指向一个n维数组(4定义的时候必须已知,即后几维必须已知

                           p=new int[3][4];// 第一维可以是常量或表达式,其他维必须全部为常量

                           Delete [ ]p;

    对象:可以在创建对象的时候同时进行初始化

               语法: 类名 *指针变量 = new 类名(实参表);

    对象数组:

               语法:类名 数组名[元素个数];

                           或: 类名* 指针名;指针名=new 类名[数组长度];

               举例:Point A[2];

                           Point* p;

                          *p=new Point[5];

                           delete [ ]p;

               初始化:每个对象都要调用一次构造函数和一次析构函数。

                     1)对象数组确定且长度有限:可以使用参数列表初始化

                        Point A[2]={Point(1,2),Point(3,4)};

                     2)对象数组长度比较大或不确定:只能调用无参或者使用缺省参数的函数

                      Point A[2];

                原因:在建立对象数组的时候,C++不允许整体对对象进行初始化(即[ ]和( )不能一起使用),这时不能给对象 使用有参数的构造函数

                所以:若创建一个类的对象数组,就对给类的构造函数有要求:对象数组只能调用一个不需要参数的构造函数

    常见问题:

    1):有了malloc/free 为什么还要new/delete?

               malloc/free 只能满足内部数据类型的变量,它们只需要申请空间,无法对空间进行操作

               而对于非内部数据类型的对象来说,对象在创建的同时要自动执行构造函数,在消亡之前要自动执行析构函数。

               由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够自动地调用构造函数和析构函数。即用无法满足动态对象的要求。

               因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete

               注意new/delete 不是库函数,而是运算符。malloc/free 是标准库函数。

    2):malloc/free  和 new/delete 的相同点和不同点

                 相同点:它们都可以申请和释放空间。

                 不同点:

                          一、new :分配内存 + 调用类的构造函数 + 初始化  delete:释放内存 + 调用类的析构函数

                                  malloc:只分配内存,不会进行初始化类成员的工作   free只释放内存,不会调用析构函数

                          二、new delete 是运算符,可以进行重载

                                  malloc,free是函数,不可以进行重载

                          三、new delete 更加安全,简单:

                                  不用计算类型大小:自动计算要分配存储区的字节数

                                  不用强制类型转换:自动返回正确的指针类型

                         四、new可以分配一个对象或对象数组的存储空间,malloc不可以

                         五、可以超载与类相关的new和delete

                         六、malloc/free 是标准库函数,new/delete是C++运算符

    2):new和delete搭配使用,malloc和free搭配使用:混搭可能出现不可预料的错误

    3):new后执行的三个操作:(某面试题目)

                           1、new的类分配内存空间。
                           2、 调用类的构造方法。
                           3 、返回该实例(对象)的内存地址

    展开全文
  • ,他在申请空间时,如果发生扩容将会将内部元素整体移动到新申请出来的空间上。 我们 来看看realloc 函数 void realloc(void src,sizeof(Type)* num)** 想一想可以实现吗 ? 我们都知道,当relloc的源指针是NULL 的...
  • 调用函数用new申请空间的释放方法

    千次阅读 2018-07-19 11:56:10
    问题:调用函数用new申请空间,如果不释放则会存在内存泄露问题 调用函数用new申请空间的释放方法 方法一:将要反馈的结果赋值给一个栈元素,栈元素会随着函数调用的完成而自动释放占用的空间。 方法二:用一个...
  • 测试ok,代码如下: ... * 功能:malloc申请空间函数的两种返回方法 * 作者:lml 时间:2020年4月16日 12:25 ******************************************/ #include <stdio.h> #include <s...
  • 指针申请空间

    2017-04-01 23:22:47
    实参和形参是指向同一个地址(虽说传递的是指针,但是原指针传递进函数内后生成一个指针的拷贝,此时拷贝指向的地址与原指针相同,函数内新的申请空间地址赋值给拷贝指针后,原指针并没有改变) ,它们只是指向相同,...
  • linux内核申请空间方法总结

    千次阅读 2012-10-26 14:37:53
    内核 内存申请与释放 1、申请内存的函数kmalloc... GFP_USER(表示当前为用户态进程申请空间,可引起休眠)  GFP_ATOMIC(用在中断处理历程或其他运行于进程上下文之外的代码中分配内存,不会休眠)  GFP_NOF
  • 什么是指针以及如何动态申请空间

    千次阅读 2017-05-15 22:07:14
    int a;int *p;第一个比较熟悉,就是定义一个整型变量。第二个就是定义了一个整型指针变量p; 1.指针有什么作用?  指针是存储一个地址!注意是地址,不是什么具体的数值。...动态申请空间: int
  • 1. 动态申请空间1.1 基本内容 Ⅰ 动态申请的空间没有具体名称,只能通过指针间接访问(无论new还是malloc方式)。  Ⅱ 动态申请空间都是存放在堆中,有别于系统自动分配的空间是存放在堆栈中(即栈)。  Ⅲ 栈中...
  • 摘要:本文主要探究一个问题:为什么使用指针变量时一定要申请空间? 1、问题的提出: 我们在使用指针时,有时需要用指针指向一个变量,用指针来对变量进行操作;而有时我们就需要直接定义一个指针变量,然后用...
  • C++二维数组的声明与空间申请有多种方法,有时在申请时知道所...这个申请空间是直接将内存一块连续的存储区域分配给指针A,A[i]代表一个指向某一行的指针。 优点:调用直观,连续存储。 缺点:m必须已知。 2、不
  • 1. 单链表结点 //Definition for singly-linked list. struct ListNode { ... //声明一个单链表结点,并给他分配空间,结点的值val初始化为0,其指向下一个结点的指针为NULL ListNode* node=new ListNode(0); /
  • 【C语言】动态申请空间

    千次阅读 多人点赞 2020-03-19 18:44:51
    3、realloc函数返回的也是无类型的地址,因此自己定义相应的类型变量来接收realloc分配的内存 4、realloc函数申请的扩充空间原数据依次覆盖。 注意: 1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存...
  • 本来不准备写这封博客的,但是今天一学弟对我说,动态申请空间的这份代码在POJ上交会超时,于是试了试,果然超时了。然后就学会了新的处理字典树的方法,静态申请空间,不需要频繁的调用new,所以效率会更高。。。
  • malloc函数内存什么地方申请空间

    千次阅读 2019-07-27 23:46:41
    https://zhidao.baidu.com/question/477779079.html 内存分为堆区,栈区,静态区,代码区。 全局变量和静态变量存放在静态区,局部变量存在在栈区,动态申请的变量(即new,malloc函数申请的变量)存放在堆区。 ...
  • char **data; *data = malloc (100); 为什么段错误 应该怎么申请
  • string对象的初始化系统申请空间依编译器的不同而不同: 1、对VS来说,当我们需要申请空间小于15时,系统每次默认分配15个字符空间;当需要申请的字符空间大于15时,系统会多余分配16个字符空间,,在随后的...
  • C/C++动态申请空间方式

    千次阅读 2018-11-14 14:34:28
    1:C语言动态申请一维数组: #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; int main() {  int i=0;  int m=9;  int *p = (int*)malloc(sizeof(int)*m);  for(;i&lt;m; +...
  • C/C++动态申请空间

    千次阅读 2016-08-15 17:33:54
    C语言中用malloc/free; C++里用new/delete;1:C语言动态申请一维数组:#include #include int main() { int i=0; int m=9; int *p = (int*)malloc(sizeof(int)*m); for(;i; ++i) {
  • C/C++申请空间与释放空间的两种方法

    万次阅读 2015-07-16 10:54:52
    1. C语言的函数malloc和free  (1) 函数malloc和free在头文件中的原型及参数  void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,...释放动态申请的内存空间,调用free
  • 当我们创建数组的时候,总是需要提前预定数组的长度,然后编译器分配预定长度 的数组空间,在使用数组的时,会有这样的问题,数组也许空间太大了,浪费空 间,也许空间不足,所以对于数组来讲,如果能根据需要来分配...
  • 七牛云申请空间及配置CDN加速

    千次阅读 2019-05-18 11:19:28
    3. 新建存储空间 如上图中: test即为Bucket名称 http://proirpgeq.bkt.clouddn.com/ 为七牛云CDN域名(路径全称,末尾带/) 4. 获取密钥 图中AK即为Access Key字段。 图中SK即为Secret Key字段。 以上四...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,936
精华内容 8,374
关键字:

申请空间