【CXX】6.7 SharedPtr<T> — std::shared_ptr<T>
std::shared_ptr 的 Rust 绑定称为 SharedPtr。
限制:
SharedPtr 不支持 T 为不透明的 Rust 类型。对于在语言边界上传递不透明 Rust 类型的所有权,应改用 Box(C++ 中的 rust::Box)。
示例
// src/main.rs
use std::ops::Deref;
use std::ptr;
#[cxx::bridge]
mod ffi {
unsafe extern "C++" {
include!("example/include/example.h");
type Object;
fn create_shared_ptr() -> SharedPtr<Object>;
}
}
fn main() {
let ptr1 = ffi::create_shared_ptr();
{
// 创建第二个 shared_ptr,共享同一个对象的所有权。
// 仍然只有一个 Object,但有两个 SharedPtr<Object>。
// 两个指针都指向堆上的同一个对象。
let ptr2 = ptr1.clone();
assert!(ptr::eq(ptr1.deref(), ptr2.deref()));
// ptr2 超出作用域,但 Object 尚未被销毁。
}
println!("向 Object 说再见");
// ptr1 超出作用域,Object 被销毁。
}
// include/example.h
#pragma once
#include <memory>
class Object {
public:
Object();
~Object();
};
std::shared_ptr<Object> create_shared_ptr();
// src/example.cc
#include "example/include/example.h"
#include <iostream>
Object::Object() { std::cout << "construct Object" << std::endl; }
Object::~Object() { std::cout << "~Object" << std::endl; }
std::shared_ptr<Object> create_shared_ptr() {
return std::make_shared<Object>();
}