C++中new object的一些问题以及和java的不同。
第一次写c++不理解newobject和不new的区别:
SensorInfo*si1=newSensorInf(name);
SensorInfosi2(name);
si1是new出来的,在c++中相当于malloc动态分配了一个内存,并返回一个SensorInfo对象的指针,而si2,只是在stack中本地分配一块内存,当函数叼哦那个结束,此对象就会消失。
类比基础类型相当于
si1:
char*s1=malloc(sizeof(char)*n);
chars2="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++中就没这么幸福了。
今天又犯了个初级错误:
JSRSEnsorInfojsrSensor=list2[0];
jsrSensor和list2[0]其实是两个对象
JSRSEnsorInfojsrSensor=list2[0];做了一次对象拷贝
所以当你操作jsrSensor.x=1时list2[0].x并不一定等于0
而在java中jsrSensor.x=1时list2[0].x也等于1,
因为java中JSRSEnsorInfojsrSensor=list2[0];是将引用赋值给jsrSensor。
在C++中相当于JSRSEnsorInfo*jsrSensor=&list2[0];
此时jsrSensor->x=1则list2[0].x也是1