精华内容
下载资源
问答
  • C++new 用法

    2012-12-02 00:12:51
    C++new函数的用法,学习C++必备
  • C++ new用法

    千次阅读 2014-04-09 16:55:24
    C++ 编程语言中有一种叫做new的...在这里我们将会通过对C++ new用法的介绍,帮助大家一起分析一下。  C++ new用法之一 new运算符  最常用的是作为运算符的new,比如: string *str = new string(“test
    C++ 编程语言中有一种叫做new的术语。不过这一概念是比较模糊的,有些人把它理解为new函数,但是有的人又会把它理解为new运算符。那么它的真正含义又是如何的呢?在这里我们将会通过对C++ new用法的介绍,帮助大家一起分析一下。 
    

      C++ new用法之一 new运算符

      最常用的是作为运算符的new,比如:

    string *str = new string(“test new”);

      作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。

      new会在堆上分配一块内存,并会自动调用类的构造函数。

      C++ new用法之二 new函数

      第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:

    void *operator new(size_t size);

      new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。

      如果使用new函数,和语句string *str = new string(“test new”)相对的代码大概是如下的样子:

    1.string *str = (string*)operator new(sizeof(string));
    2.str.string(“test new”);
    3.// 当然这个调用时非法的,但是编译器是没有这个限制的

      这还不算完,还有第三种的new存在。

      C++ new用法之三 placement new

      第三种,placement new,这也是new作为函数的一种用法,它允许你在一块已存在的内存上分配一个对象,而内存上的数据不会被覆盖或者被你主动改写,placement new同样由new操作符调用,调用格式是:

    new (buffer) type(size_t size);

      先看看下面的代码:

    4.char str[22];
    5.int data = 123;
    6.int *pa = new (&data) int;
    7.int *pb = new (str) int(9);

      结果*pa = 123(未覆盖原数据),而*pb = 9(覆盖原数据),可以看到placement new 并没有分配新的内存,也可以使用在栈上分配的内存,而不限于堆。

      为了使用placement new 你必须包含或者

      其实placement new和第二种一样,只不过多了参数,是函数new的重载,语法格式为:

    void *operator new(size_t, void* buffer);

      它看起来可能是这个样子:

    void *operator new(size_t, void* buffer) { return buffer;}

      和new对应的就是delete了,需要回收内存啊,不然就泄漏了,这个下次再写吧,回忆一下今天的内容先。

      总结

      1. 函数new
      void *operator new(size_t size); 在堆上分配一块内存,和placement new(void *operator new(size_t, void* buffer)); 在一块已经存在的内存上创建对象,如果你已经有一块内存,placement new会非常有用,事实上,它STL中有着广泛的使用。
      2. 运算符new
      最常用的new,没什么可说的。
      3. 函数new不会自动调用类的构造函数,因为它对分配的内存类型一无所知;而运算符new会自动调用类的构造函数。
      4. 函数new允许重载,而运算符new不能被重载。
      5. 紧接着就是对应的delete。

      以上就是对C++ new用法的详细介绍。

     

    转自:http://blog.sina.com.cn/s/blog_69e905cd0100k51b.html

    展开全文
  • C++ new用法的正确方法应该如何操作? 在这篇文章中我们将会根据其两种不同的含义分别介绍一下它的影音方法,希望能给大家带来一些帮助。 C++编程语言中有一种叫做new的术语。不过这一概念是比较模糊的,...
    • C++ new用法的正确方法应该如何操作?
    • 在这篇文章中我们将会根据其两种不同的含义分别介绍一下它的影音方法,希望能给大家带来一些帮助。
    • C++编程语言中有一种叫做new的术语。不过这一概念是比较模糊的,有些人把它理解为new函数,但是有的人又会把它理解为new运算符。那么它的真正含义又是如何的呢?在这里我们将会通过对C++ new用法的介绍,帮助大家一起分析一下。

       

      C++ new用法之一 new运算符

      最常用的是作为运算符的new,比如:

      string *str = new string(“test new”);

      作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。

      new会在堆上分配一块内存,并会自动调用类的构造函数。

      C++ new用法之二 new函数

      第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:

      void *operator new(size_t size);

      new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。

      如果使用new函数,和语句string *str = new string(“test new”)相对的代码大概是如下的样子:

       

                  
         
      1. string *str = (string*)operator new(sizeof(string));  
      2. str.string(“test new”);   
      3. // 当然这个调用时非法的,但是编译器是没有这个限制的 

       

      这还不算完,还有第三种的new存在。

      C++ new用法之三 placement new

      第三种,placement new,这也是new作为函数的一种用法,它允许你在一块已存在的内存上分配一个对象,而内存上的数据不会被覆盖或者被你主动改写,placement new同样由new操作符调用,调用格式是:

      new (buffer) type(size_t size);

      先看看下面的代码:

       

                  
         
      1. char str[22];  
      2. int data = 123;  
      3. int *pa = new (&data) int;  
      4. int *pb = new (str) int(9); 

       

      结果*pa = 123(未覆盖原数据),而*pb = 9(覆盖原数据),可以看到placement new 并没有分配新的内存,也可以使用在栈上分配的内存,而不限于堆。

      为了使用placement new 你必须包含<new>或者<new.h>

      其实placement new和第二种一样,只不过多了参数,是函数new的重载,语法格式为:

      void *operator new(size_t, void* buffer);

      它看起来可能是这个样子:

      void *operator new(size_t, void* buffer) { return buffer;}

       

      和new对应的就是delete了,需要回收内存啊,不然就泄漏了,这个下次再写吧,回忆一下今天的内容先。

      总结

      1. 函数new

      void *operator new(size_t size); 在堆上分配一块内存,和placement new(void *operator new(size_t, void* buffer)); 在一块已经存在的内存上创建对象,如果你已经有一块内存,placement new会非常有用,事实上,它STL中有着广泛的使用。

      2. 运算符new

      最常用的new,没什么可说的。

      3. 函数new不会自动调用类的构造函数,因为它对分配的内存类型一无所知;而运算符new会自动调用类的构造函数。

      4. 函数new允许重载,而运算符new不能被重载。

      5. 紧接着就是对应的delete。

      以上就是对C++ new用法的详细介绍。

    展开全文
  • C++ new用法

    万次阅读 多人点赞 2019-07-18 20:40:39
    知识点小结: new其实就是告诉计算机开辟一段新的空间,但是和一般的声明...另外需要注意的是,new使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。具体的代码如下: #include <...

    知识点小结:

    new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是,new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。具体的代码如下:

    #include <iostream>
    using namespace std;
    
    int example1()
    {
      //可以在new后面直接赋值
      int *p = new int(3);
      //也可以单独赋值
      //*p = 3;
    
      //如果不想使用指针,可以定义一个变量,在new之前用“*”表示new出来的内容
      int q = *new int;
      q = 1;
      cout << q << endl;
    
      return *p;
    }
    
    int* example2()
    {
      //当new一个数组时,同样用一个指针接住数组的首地址
      int *q = new int[3];
      for(int i=0; i<3; i++)
        q[i] = i;
    
      return q;
    }
    
    struct student
    {
      string name;
      int score;
    };
    
    
    student* example3()
    {
      //这里是用一个结构体指针接住结构体数组的首地址
      //对于结构体指针,个人认为目前这种赋值方法比较方便
      student *stlist = new student[3]{{"abc", 90}, {"bac", 78}, {"ccd", 93}};
    
      return stlist;
    }
    
    
    
    int main()
    {
      int e1 = example1();
      cout <<"e1: "<< e1 << endl;
    
      int *e2 = example2();
      for(int i=0; i<3; i++)
        cout << e2[i] << " ";
      cout << endl;
    
    
      student *st1 = example3();
    
      for(int i=0; i<3; i++)
        cout << st1[i].name << " " << st1[i].score << endl;
    
    
    
      return 0;
    }
    

     

    展开全文
  • c++ new用法

    千次阅读 2012-07-28 23:46:23
    c++ new 用法   c++new 的用户有 newoperator , operator new 和 placemenet new 1 new operator 如下代码: string *ps=new string("memory management"); 这里所使用new就是所谓new operator,是由C++...

    c++ new 用法

     

    c++ 中new 的用户有  newoperator , operator new  和 placemenet new

    1 new operator

    如下代码:

    string *ps=new string("memory management");

    这里所使用的new就是所谓new operator,是由C++语言内建的,就像sizeof那样,不能改变意义,总是做相同的事情。

    这个动作的含义分为两方面:

    第一,它分配足够的内存,用来放置某类型的对象。对于上例而言,它分配足够放置一个string 对象内存。

    第二,它调用一个构造函数,为刚才分配的内存中的那个对象设定初始值。

    new operator总是做这两件事,无论如何你是不能改变其行为。



    2operator new

    能够改变的是用来容纳对象的那块内存的分配行为,new operator调用某个函数,执行必要的内存分配动作,你可以重写或者重载那个函数,改变其行为。这个函数名称就叫operator new 。

    函数 operator new 通常声明如下:

    void * operator new (size_t size);

    其返回类型void*。即返回一个指针,指向一块原始的、未设置初始值的内存

    函数中的size_t参数表示需要分配多少内存,你可以将operator new 重载,加上额外的参数,但第一个参数类型必须总是size_t。

    或者你从来没有直接用过operator new ,但是你可以像调用任何其他函数一样地调用它

    void* rawMemory=operatornew(sizeof(string));

    这里的operator new 将返回指针,它指向一块足够容纳string对象的内存。

    和malloc一样,operator new 的唯一任务就是分配内存,它不知道什么是构造函数,它只负责分配内存。

    取得operator new 返回的内存并将之转为一个对象,是newoperator的责任。

     

    微软msdn的例子

    //new_op_new.cpp
    //compile with: /EHsc
    #include<new>
    #include<iostream>
     
    usingnamespace std;
     
    classMyClass
    {
    public:
       MyClass( )
       {
          cout << "ConstructionMyClass." << this << endl;
       };
     
       ~MyClass( )
       {
          imember = 0; cout << "DestructingMyClass." << this << endl;
       };
       int imember;
    };
     
    int main()
    {
       // The first form of new delete
       MyClass* fPtr = new MyClass;
       delete fPtr;
     
       // The second form of new delete
       MyClass* fPtr2 = new( nothrow ) MyClass;
       delete fPtr2;
     
       // The third form of new delete
       char x[sizeof( MyClass )];
       MyClass* fPtr3 = new( &x[0] ) MyClass;
       fPtr3 -> ~MyClass();
       cout << "The address of x[0] is :" << ( void* )&x[0] << endl;
    }


    输出结果

    Construction MyClass.000B3F30
    Destructing MyClass.000B3F30
    Construction MyClass.000B3F30
    Destructing MyClass.000B3F30
    Construction MyClass.0023FC60
    Destructing MyClass.0023FC60
    The address of x[0] is : 0023FC60


     

     

    3. placement new

    3.1 有时候你真的会想直接调用一个构造函数,针对一个已经存在的对象调用其构造函数,并无意义,因为构造函数用来对象初始化,而对象只能初始化一次。但是你偶尔会有一些分配好的原始内存,你需要在上面构建对象,有一个特殊的地方 operator new 称为placement new,允许这么做。

    例如:

    class Widget {   public:  Widget(int widgetSize);    ...... };

    Widget* constructWidgetInBuffer(void*buffer,int size) {   return new (buffer) Widget(size); }

    此函数返回指针,指向一个Widget object,它被构造于传递给此函数的一块内存缓存区上。当程序运行到共享内存或者内存I/O映射。这类函数可能是有用的,因为在那样运用中,对象必须置于特定的地址,或者置于特殊函数分配出来的内存上。

    3.2 函数内部

    Widget* constructWidgetInBuffer 只有一个表达式new (buffer) Widget(size),

    有点奇怪,其实不足为奇,这是new operator的用法之一,指定一个额外的自变量(buffer)作为new operator "隐式调用operator new "。于是,被调用的operator new 除了接受"一定要有size_t自变量"之外,还接受了一个void* 参数,指向一块内存,准备用来接受构造好的对象这样的operator new 就是所谓的placement new :

    void * operator new(size_t size,void*location)

    {

     return location;

    }

    operator new 的目的是要为对象找到一块内存,然后返回一个指针指向它,在placement new 的情况下,调用者已经知道指向内存的指针了,因为调用者知道对象应该放在哪里。因此placement new 唯一需要做的就是将它获得的指针再返回。

    至于没有用到(但一定得有)的size_t参数,之所以不赋予名称,为的是避免"编译器某物未被使用"的警告。

    4  总结

    另外注意:placement new 是C++标准程序库的一部分,要使用placement new 得用#include<new>,旧式编译器用#include<new.h>

    回头想想placement new ,我们便能了解new operator和operator new之间的关系。

    两个术语表面上令人迷惑,但其实很好理解:

    1)如果你希望将对象产生于heap,就是得new operator,它不但分配内存而为该对象调用一个构造函数。

    2)如果你只是打算分配内存,请用operator new,就没有构造函数被调用。

    3)如果你打算在heap object产生自己决定的内存分配方式,请写一个自己的operator new。并使用new operator,它将会自动调用你所写的operator new。

    4)如果你打算在已经分配(并拥有指针)的内存构造对象,请使用placement new 。

     


    展开全文
  • C++ new关键字用法

    2020-03-06 16:26:34
    C++中的new用法总结: 1.new operator: 这是最常见的用法,如: class A{...} A *a = new A; 2.placement new: 这个new仅在一个已经分配好的内存指针上调用构造函数,因此会覆盖原来的内容,如: A *a1 = new A; A...
  • C++ new用法 (总结)

    万次阅读 多人点赞 2015-03-21 12:09:02
    C++ new 的基本和高级用法new 的基本用法
  • C++new用法

    2015-07-29 09:44:59
    博文原地址关于C++NEW的三种用法的详细讲解!!
  • c++ new关键字的用法

    2017-11-24 09:50:41
    c++new关键字的用法有 1、创建类对象 2、隐藏继承于基类的继承成员 #include class Test { public:  virtual void print(){printf("Base Test print\n");} }; class ClassOne:public Test { ...
  • c++ new高级用法

    千次阅读 2016-06-29 20:26:46
    new高级用法 #include #include const int buf(512);//限定一个常量整数512 int N(5);//数组的长度 char buffer[buf] = {0};//静态区 //p1,p3,p5作为指针变量在栈区,存储的地址指向堆区 //手动释放内存 //p2,p4,...
  • C++ new 解析重载 .

    2015-07-08 18:30:34
    C++ new 解析重载 . - 莫水千流 - 博客园 ... C++ new 解析重载 . C++ new用法之一 new运算符 最常用的是作为运算符的new,比如: string *str = new string(“test new”);
  • c++ new int的用法

    千次阅读 2020-08-04 18:54:23
    new操作,创建一个对象并为该对象创建内存空间,最后在返回指向该内存的指针。 int *a = new int(10); //创建动态创建整型数。 //括号无参数是 a=0,有参数则a = 参数 int *p = new int[10]; //创建一个有10个元素...
  • c++ new 的几个用法

    千次阅读 2015-06-16 15:31:47
    在 c++ 里 new 有三个用法。1) new xxx, 2) operator new( int size ), 3) placement new. 最常用的是 new xxx 例如 pstr = new string(“xxx”); 这种会调用 string 的构造函数,并需要通过 delete pstr 来...
  • c++new使用方法

    千次阅读 2019-03-01 19:12:26
    c++中,new用法很灵活,这里进行了简单的总结 1. new( ) 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量; 2. new[ ] 分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量; &...
  • 主要介绍了C++new和delete的使用方法详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
  • C++new用法总结

    2020-04-30 20:07:29
    前段时间复习面试的时候,看到这个问题经常有问到,我这个小白就看了些博客和书,...这个就是平时最经常用的new用法如下程序所示: class A { public: A(int i) :a(i){} private: int a; }; int main() { A*...
  • C++new用法

    2017-12-02 22:18:35
    一.new用法: 1. new() 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量; 2. new[] 分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量; 例子: #include #include ...
  • C++ New 首先在用法明确几点:  1.他们是系统关键字。  2.他的标准实现在C++标准头文件是#include
  • c++ new用法的问题

    2015-07-05 08:41:19
    char*p=new char[2];//p指针是指向一个两个字符长度的指针 strcpy(p,"asd"); cout 结果输出是asd,p指针不是只指向含有含有两个字符的之真忙,为什么还能输出asd
  • C++ new的三种用法详细解析

    万次阅读 多人点赞 2017-07-13 19:35:55
    new有三种使用方式:plain new,nothrow new和placement new。 (1)plain new顾名思义就是普通的new,就是我们惯常使用new。在C++中是这样定义的:  void* operator new(std::size_t) throw(std::bad_alloc)...
  • c++ new的三种用法

    千次阅读 2012-09-23 21:01:21
    c++ new的三种用法 一. 简介 new有三种使用方式:plain new,nothrow new和placement new。 (1)plain new顾名思义就是普通的new,就是我们惯常使用new。在C++中是这样定义的:  void* operator new...
  • 主要介绍了C++ 中placement new 操作符使用方法的相关资料,需要的朋友可以参考下
  • C++ new 解析重载

    2011-02-23 15:51:00
    转自:http://hi.baidu.com/%C4%E3%CE%D2%CB%FD_%CD%AC%C2%B7%C8%CB/blog/item/aa4230d7bfe622cf50da4b28.htmlC++中new的总结 C++ new用法之一 new运算符 最常用的是作为运算符的new,比如: string ...
  • c++ new/delete的用法

    千次阅读 2015-03-17 20:18:41
    们可以通过对比的方式来看看C++delete的作用,并对这方面的知识有一个充分的认识。 · C++内存管理不同方式分析 · C++迭代器基本内容讲述 · C++浅拷贝具体内容讲述 · C++回调函数代码示例解读 ·

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 419,251
精华内容 167,700
关键字:

c++new的用法

c++ 订阅