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

c++

相关推荐