std::shared_ptr 的 Rust 綁定稱為 SharedPtr。
限制:
SharedPtr 不支持 T 為不透明的 Rust 類型。對于在語言邊界上傳遞不透明 Rust 類型的所有權,應改用 Box(C++ 中的 rust::Box)。
示例
// src/main.rsuse 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>();
}