面试题答案
一键面试// 假设这是一个被引用的结构体
struct InnerStruct {
data: i32,
}
// 定义包含对InnerStruct引用的复杂结构体
struct OuterStruct<'a> {
inner_ref: &'a InnerStruct,
other_data: String,
}
impl<'a> OuterStruct<'a> {
fn new(inner: &'a InnerStruct, other: String) -> Self {
OuterStruct {
inner_ref: inner,
other_data: other,
}
}
}
fn main() {
let inner = InnerStruct { data: 42 };
let outer = OuterStruct::new(&inner, "Hello".to_string());
// 此时outer的生命周期受inner影响,只要inner存活,outer就能安全引用
}
在上述Rust代码示例中:
InnerStruct
是一个简单的结构体,作为被引用的对象。OuterStruct
包含一个对InnerStruct
的引用inner_ref
以及其他成员other_data
。通过生命周期参数'a
,明确指定inner_ref
的生命周期与传入的InnerStruct
引用的生命周期一致。- 在
main
函数中,创建InnerStruct
实例inner
,然后基于inner
创建OuterStruct
实例outer
。只要inner
存活,outer
对inner
的引用就是安全的,从而避免了生命周期冲突问题。
如果使用C++ 语言,可以通过智能指针来管理生命周期:
#include <iostream>
#include <memory>
// 假设这是一个被引用的结构体
struct InnerStruct {
int data;
InnerStruct(int d) : data(d) {}
};
// 定义包含对InnerStruct引用的复杂结构体
struct OuterStruct {
std::shared_ptr<InnerStruct> inner_ptr;
std::string other_data;
OuterStruct(std::shared_ptr<InnerStruct> inner, const std::string& other)
: inner_ptr(inner), other_data(other) {}
};
int main() {
auto inner = std::make_shared<InnerStruct>(42);
auto outer = std::make_shared<OuterStruct>(inner, "Hello");
// 使用智能指针,当没有任何指针指向InnerStruct实例时,内存会自动释放
return 0;
}
在上述C++ 代码中:
- 使用
std::shared_ptr
来管理InnerStruct
的生命周期。OuterStruct
持有一个std::shared_ptr<InnerStruct>
,这样多个OuterStruct
实例可以共享同一个InnerStruct
实例的所有权。 std::shared_ptr
会自动处理内存释放,当最后一个指向InnerStruct
实例的std::shared_ptr
被销毁时,对应的内存会被自动释放,有效避免了内存泄漏和悬空指针等生命周期相关问题。