一:在学习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>
-
int main()
-
{
-
using namespace std;
-
int *p = new int(10);
-
cout << *p << endl;
-
}
执行结果为 10