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

news/2024/11/29 7:37:32/

一:在学习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 


http://www.ppmy.cn/news/563795.html

相关文章

Can not create a Path from an empty string解决

完整报错如下: java.lang.IllegalArgumentException: Can not create a Path from an empty stringat org.apache.hadoop.fs.Path.checkPathArg(Path.java:126)at org.apache.hadoop.fs.Path.<init>(Path.java:134)at org.apache.hadoop.fs.Path.<init>(Path.java:…

C#操作字符串方法总结lt;转gt;

1 staticvoid Main(string[] args)2 {3 string s "";4 //&#xff08;1&#xff09;字符访问&#xff08;下标访问s[i]&#xff09;5 s "ABCD";6 Console.WriteLine(s[0]); // 输出"A";7 …

linux下移植电容屏驱动gt9xx 笔记

# evtest /dev/event0 或者 # hexdump /dev/event0// 分析&#xff1a; \drivers\i2c\busses\I2c-digicolor.c static struct platform_driver i2c_dc_driver {.probe i2c_dc_probe,.remove __exit_p(i2c_dc_remove),.driver {.name "i2c-digicolor",.owne…

mtk6582平台GT9157触摸屏驱动移植

一.GT9157触摸屏移植 1.在mediatek/config/sanstar82_cwet_kk/ProjectConfig.mk中 CUSTOM_KERNEL_TOUCHPANELGT9XX (将GT9XX驱动加载到内核中) 2.在mediatek/custom/sanstar82_cwet_kk/kernel/touchpanel/GT9XX/tpd_custom_gt9xx.h中修改固件 (1)在有厂商固件的情况下 将…

前端vue经典面试题78道(重点详细简洁)

目录 1.自我介绍 2.vue面试题 1.v-show和v-if区别的区别&#xff1a; 2.为何v-for要用key 3.描述vue组件声明周期mm 单组件声明周期图 ​父子组件生命周期图 4.vue组件如何通信 5.描述组件渲染和更新的过程 1、vue 组件初次渲染过程 2、vue 组件更新过程 6.双向数据…

MATLAB2020a报错:函数或变量 ‘svmtrain‘ 无法识别。

版权声明&#xff1a;转载请注明作者&#xff08;独孤尚良dugushangliang&#xff09;出处&#xff1a;https://blog.csdn.net/dugushangliang/article/details/108594259 遇到问题&#xff0c;上网搜索&#xff0c;折腾许久&#xff0c;悬而未决。 遇到这个错误的原因是&…

vscode——HTML基本标签A标签超级链接

什么是超级链接&#xff1a; 1通过超级连接建立链接的关系——>从一个页面跳转另一个页面——>a标签是成对出现的——<a></a>有开始有结束——>a标签不加属性&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta c…

gt9xx驱动分析笔记

# evtest /dev/event0 或者 # hexdump /dev/event0 // 分析&#xff1a; \drivers\i2c\busses\I2c-digicolor.c static struct platform_driver i2c_dc_driver { .probe i2c_dc_probe, .remove __exit_p(i2c_dc_remove), .driver { .name "i2c-digicolor", .o…