C++中new object的一些问题以及和java的不同。

第一次写c++ 不理解new object 和不new的区别:

SensorInfo* si1 = new SensorInf(name);
SensorInfo si2(name);

si1 是new出来的,在c++中相当于malloc动态分配了一个内存,并返回一个SensorInfo对象的指针, 而si2,只是在stack中本地分配一块内存,当函数叼哦那个结束,此对象就会消失。
类比基础类型相当于
si1:
char* s1 = malloc(sizeof(char)*n);
char s2 = "xxxx";

以上表示的很清楚,s1需要释放内存,而s2不需要释放内存。
所以在使用Vector时,在执行Vector.clear时,对于以上两种世纪有不同的操作。
VECTOR(JSRSensorInfo*) list1;
VECTOR(JSRSensorInfo) list2;

list1.push_back()会copy一个指针的值(32位数字)到list1里
list1.clear只会清除对象的指针也就是那个32位的地址,并不会帮你销毁掉指针指向的对象。

list2.push_back()会把你传进去的对象copy一份放入list2中
list2.push_back()会帮你销毁对象并调用析构函数处理你需要销毁的其他成员变量。

在c++中使用对象时,需要注意这种对象的区别,想清楚自己需要哪种对象,否则很容易造成内存泄露。而java中并不需要担心这个问题,就算你用list1.clear了,没有销毁对象也有gc帮你擦屁股,但是在c++中就没这么幸福了。

今天又犯了个初级错误:
JSRSEnsorInfo jsrSensor = list2[0];
jsrSensor 和list2[0]其实是两个对象
JSRSEnsorInfo jsrSensor = list2[0]; 做了一次对象拷贝
所以当你操作jsrSensor.x = 1时list2[0].x并不一定等于0
而在java中jsrSensor.x =1 时list2[0].x 也等于1,
因为java中JSRSEnsorInfo jsrSensor = list2[0]; 是将引用赋值给jsrSensor。
在C++中相当于JSRSEnsorInfo* jsrSensor = &list2[0];
此时jsrSensor->x = 1 则 list2[0].x 也是1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值