C++ 智能指针示例代码
时间: 2023-09-07 07:17:25 浏览: 43
下面是一个使用智能指针的示例代码:
```c++
#include <iostream>
#include <memory>
class MyClass {
public:
void doSomething() {
std::cout << "MyClass::doSomething()" << std::endl;
}
};
int main() {
std::unique_ptr<MyClass> ptr1(new MyClass);
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
if (ptr1 == nullptr) {
std::cout << "ptr1 is null" << std::endl;
}
ptr2->doSomething();
return 0;
}
```
在此示例中,我们使用 `std::unique_ptr` 创建了两个指向 `MyClass` 类对象的指针 `ptr1` 和 `ptr2`。然后,我们将 `ptr1` 移动到 `ptr2` 中,并检查 `ptr1` 是否为空。最后,我们调用 `ptr2` 指向的对象的 `doSomething()` 方法。
需要注意的是,`std::unique_ptr` 是一种独占智能指针,即同一时间只能有一个指针拥有该对象。在移动指针时,原指针会自动被设置为 `nullptr`,以避免出现多个指针同时拥有同一个对象的情况。
相关问题
jni c++ 智能指针NewByteArray
JNI(Java Native Interface)是Java提供的一种机制,用于实现Java与其他编程语言(如C++)之间的交互。JNI允许Java程序调用本地代码(Native Code),也可以让本地代码调用Java程序。
在JNI中,可以使用智能指针来管理本地代码中的内存资源。智能指针是一种自动管理内存的指针,它会在不再需要时自动释放所指向的内存。在C++中,可以使用std::shared_ptr或std::unique_ptr来实现智能指针的功能。
对于JNI中的NewByteArray函数,它是用来创建一个新的字节数组对象的函数。具体使用方式如下:
```cpp
jbyteArray NewByteArray(JNIEnv *env, jsize length);
```
其中,env是JNI环境指针,length是字节数组的长度。该函数会在本地代码中创建一个新的字节数组对象,并返回该对象的引用。
使用智能指针来管理NewByteArray函数创建的字节数组对象可以有效地避免内存泄漏问题。以下是使用std::shared_ptr来管理字节数组对象的示例代码:
```cpp
#include <jni.h>
#include <memory>
void foo(JNIEnv *env) {
jbyteArray byteArray = env->NewByteArray(10);
std::shared_ptr<jbyteArray> byteArrayPtr(byteArray, [env](jbyteArray arr) {
env->DeleteLocalRef(arr);
});
// 使用byteArrayPtr操作字节数组对象
// ...
}
```
在上述示例中,使用std::shared_ptr来创建一个智能指针byteArrayPtr,它会在不再需要时自动调用DeleteLocalRef函数释放字节数组对象。
c++智能指针的头文件
以下是C++11标准库中<memory>头文件中定义的三种类型的智能指针:
1. unique_ptr:独占所有权的智能指针,不能被复制,只能通过移动语义转移所有权。
2. shared_ptr:共享所有权的智能指针,可以被多个指针共享,使用引用计数来管理内存。
3. weak_ptr:弱引用智能指针,指向shared_ptr所管理的对象,但不会增加引用计数,不会影响对象的生命周期。
以下是<memory>头文件的示例代码:
```c++
#include <memory>
int main() {
// 创建unique_ptr
std::unique_ptr<int> up(new int(42));
// 创建shared_ptr
std::shared_ptr<int> sp1(new int(42));
std::shared_ptr<int> sp2 = sp1;
// 创建weak_ptr
std::weak_ptr<int> wp = sp1;
return 0;
}
```