`
hellsing42
  • 浏览: 262021 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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


分享到:
评论

相关推荐

    java调用C++ webservice

    在IT行业中,跨语言通信是常见的需求,尤其是在Java和C++这样的不同编程环境中。本话题主要探讨如何使用Java调用由C++实现的Web服务(Webservice)。在给出的描述中,提到了通过WSDL(Web Services Description ...

    Jni中C++和Java的参数传递

    在C++代码中,你需要创建一个`DiskInfo`结构体,然后使用JNI的`NewObject`函数创建Java对象,并通过`SetObjectField`或`SetIntField`等函数设置对应的字段。对于数组,可以使用`NewObjectArray`创建数组对象,然后...

    Android中C/C++调用Java代码

    "Android中C/C++调用Java代码" Android中C/C++调用Java代码是通过Java Native Interface(JNI)实现的。JNI提供了一种机制,允许Java代码和native代码之间相互调用。下面我们将详细介绍Android中C/C++调用Java代码...

    java调用C++ Demo

    - `FindClass`,`GetMethodID`,`NewObject`等函数:用于查找Java类、方法ID和创建新对象。 5. **编译和链接**:C++代码需要链接到JVM库,生成动态链接库(Windows上的.dll或Linux上的.so)。确保库的路径在运行时...

    java jni c++代码

    3. **JNI函数**: 例如`FindClass`, `GetMethodID`, `NewObject`等,用于在C/C++中操作Java对象和类。 4. **JNI环境**: 一个结构体指针,包含了执行本地方法所需的所有上下文信息。 在Visual Studio 2010中开发JNI...

    java与c++交互(JNI学习笔记)

    在Java Native Interface (JNI) 中,Java 和 C/C++ 的数据类型有着明确的对应关系。理解这些对应关系是实现Java与C++交互的基础。 - **基本类型**: - Java 的 `boolean` 对应于 C/C++ 的 `jboolean` 类型,通常是...

    jni之c++和java互编

    3. **JNI函数和数据类型**:JNI定义了一系列的函数,如`FindClass`, `GetMethodID`, `NewObject`等,用于操作Java对象和方法。同时,它还定义了诸如`jobject`, `jclass`, `jmethodID`等数据类型,这些类型在C++代码...

    JNI_JAVA_C++.zip

    在本主题"JNI_JAVA_C++"中,我们将深入探讨如何利用JNI在Java和C++之间实现数据交换,以及调用和实现彼此的函数。 首先,让我们了解JNI的核心概念。JNI接口提供了一组API,使得开发者可以编写本地方法(即非Java...

    C#的COM事件在C++和JAVA中触发和响应的实现

    在C#中定义事件和接口,然后在C++或JAVA中实现这些接口,通过调用相应的方法触发事件,从而实现事件的订阅和响应。这种机制对于构建多语言互操作的系统非常有用,尤其是在需要整合不同开发环境的项目中。

    迅雷Java和C++面试题

    尽管具体的面试题目没有给出,但我们可以根据C++和Java这两门语言的特点,以及通常在IT行业的面试中可能考察的知识点来推测和总结相关的知识点。 ### C++相关知识点 #### 1. 基础语法与数据类型 - **基础语法**:...

    Jni中C++和Java的参数传递.pdf

    在C++中,你可以创建一个函数来处理这种转换,并通过JNI的`NewObject`和`GetObjectField`等函数获取Java对象的字段值。 总的来说,JNI提供了一种灵活的方式来连接Java和C++代码,允许开发者充分利用两种语言的优点...

    java 与c++的比较

    尽管Java和C++都有各自的优点和缺点,但它们都是现代软件开发中不可或缺的语言。选择哪种语言取决于具体项目的需要和个人偏好。对于软件工程师来说,了解并熟练掌握这两种语言都是非常有价值的。 通过上述对比,...

    jni.zip_c调用java_java 调用 c++_安卓 JNI

    以下将详细阐述JNI的工作原理、使用场景以及如何实现Java调用C/C++和C/C++调用Java。 1. JNI工作原理: JNI的核心思想是通过桥接Java虚拟机(JVM)和本地代码来实现互操作性。在JNI中,Java代码创建一个`native`...

    C_Java_Transfer.zip

    同样,可以使用`NewObject`和`SetFieldID`等函数,将C结构体的数据设置到新建的Java对象中,完成反向转换。 **方法二:使用JNI本地类型映射** 1. **利用JNI本地类型映射** JNI提供了一些本地类型,可以直接映射...

    C++ Java API文档.zip

    C++提供了手动的内存管理,通过new和delete操作符分配和释放内存,而Java采用自动垃圾回收机制,由JVM负责内存的分配和回收,程序员无需显式地管理内存,降低了内存泄露的风险。 此外,两者在面向对象特性上也有...

    安卓Android源码——代码调用C++代码和C++代码调用代码.zip

    - 查找Java类和方法:使用`FindClass`找到Java类,`GetMethodID`获取方法ID,`NewObject`创建对象,`CallVoidMethod`等函数调用方法。 - 注册回调:C++可以通过`SetObjectField`等方法设置Java对象字段,这些字段...

    一些java简单程序

    3. **类与对象**:Java是一种面向对象的语言,所以理解类(class)和对象(object)的概念至关重要。类是对象的蓝图,它定义了对象的属性(fields)和行为(methods)。通过`new`关键字,你可以创建类的实例,即对象...

    C调用java详解和源代码

    标签"C++"和"Java"进一步强调了这是关于两个不同编程语言之间的互操作性问题。C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。而Java是一种广泛使用...

    JAVA和C++实现面向对象方法的分析.zip

    面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它通过将数据和操作数据的方法封装在对象中,实现了程序设计的抽象、封装、继承和多态等核心特性。Java和C++是两种广泛使用的支持面向...

    使用C/C++实现Java的Native方法接口(JNI)/ JNI编程(C/C++) 代码实例

    - `env->NewObject(cls, constructorID, args)`:创建Java对象。 - `env->GetFieldID(cls, fieldName, fieldSignature)`:获取Java字段ID。 - `env->GetObjectField(obj, fieldID)`:获取Java对象的字段值。 9. ...

Global site tag (gtag.js) - Google Analytics