关于new的用法: classA & p = *new A;

一:在学习binder 的时候看到如下一段关于   class A & p = *new A ;

// frameworks/native/libs/binder/static.cpp

Mutex& gProcessMutex = *new Mutex;
sp<ProcessState> gProcess;


new其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。

通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。

另外需要注意的是,new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。

具体的代码如下:

#include <iostream>
using namespace std;
 
int example1()
{
  //可以在new后面直接赋值
  int *p = new int(3);
  //也可以单独赋值
  //*p = 3;
 
  //如果不想使用指针,可以定义一个变量,在new之前用 “*” 表示new出来的内容。 new 出来的内容是地址,一般需要指针表示,比如 class A ,用 new A 出来的是一块class A 的地址。
  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;

}

1. 
new int[]  是创建一个int型数组,数组大小是在[]中指定,
例如:
int * p = new int[10]; //p执行一个长度为10的int数组。

2. new int()是创建一个int型数,并且用()括号中的数据进行初始化,
例如:
int *p = new int(10);  // p指向一个值为10的int数。分配一个int 类型的空间,这个空间初始化数据值为10,返回存储为10的空间首地址。
int a = 10,也叫静态创建,申明的变量的内存在栈里面;
int *p=new int(10)   是在“堆”上指定了一个int变量,并把该变量的地址赋给了int *型指针p;该变量没有名称,只能通过*p访问;当程序退出定义该变量的板块后,该变量仍然存在,若反复这样做,会造成“内存泄漏”,所以要在退出时用delete p来释放

而int a=10;  int *p=a;   的变量名是a,可以通过名称访问,也不存在上述问题,当退出定义板块时它们都自动释放了。

#include <cstring>
  1. int main()

  2. {

  3. using namespace std;

  4. int *p = new int(10);

  5. cout << *p << endl;

执行结果为 10 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值