122得票11回答
智能指针:谁拥有对象?

C++ 的重点在于内存所有权 - 即所有权语义。 动态分配内存的块的所有者有责任释放该内存。因此,问题实际上变成了谁拥有该内存。 在 C++ 中,指针类型所包含的原始指针的所有权是有文档记录的,因此在一个好的(我个人认为)C++ 程序中很少看到传递原始指针的情况(因为原始指针没有隐含的所有权,...

49得票3回答
将unique_ptr作为裸指针返回以表示所有权语义是一种不好的做法吗?

我编写了一个静态工厂方法,该方法返回一个新的Foobar对象,并从另一个数据对象中填充。最近,我对所有权语义变得着迷,想知道通过使这个工厂方法返回一个 unique_ptr 是否传达了正确的信息。class Foobar { public: static unique_ptr<F...

23得票1回答
Rust如何移动不可复制的堆栈变量?

这里有一个很好的Rust移动语义示例: Rust Move Semantics在Rust By Example网站上有记录。 我基本理解了所示范的两种情况。第一种是如何给基本类型创建一个新的别名,因为i32使用Copy特性,所以原始值仍然可以使用,因为最终结果是副本。这对我来说很有意义。 此外...

15得票4回答
如何调用一个消耗自身 (consumes self) 的方法,针对的是一个被装箱的 trait 对象?

我有一个实现的草图:trait Listener { fn some_action(&mut self); fn commit(self); } struct FooListener {} impl Listener for FooListener { fn...

11得票3回答
我怎样才能重复使用已经移出值的盒子?

我有一些不可复制的类型和一个消耗并(可能)生成它的函数: type Foo = Vec<u8>; fn quux(_: Foo) -> Option<Foo> { Some(Vec::new()) } 现在考虑一种在概念上与 Box 很相似的类型:...

9得票5回答
在C++析构函数中访问所有者

假设有一个对象A,它通过std::unique_ptr<B>拥有了对象B。此外,B通过一个弱指针引用了对象A。因此,由于A拥有B,A的析构函数将调用B的析构函数。 在B的析构函数中,有什么安全的方法可以访问A?(因为我们可能也在A的析构函数中) 一种安全的方法是在A的析构函数中...

9得票1回答
接受 &str 或移动 String 而无需复制的通用函数

我希望编写一个通用函数,可以接受任何类型的字符串(&str/String),以方便调用者使用。 该函数内部需要一个 String,因此如果调用者使用 String 调用函数,则我也希望避免不必要的重新分配。 foo("borrowed"); foo(format!("owned")...

8得票3回答
Delphi中明确表达所有权

我主要是C ++程序员,我习惯于使用类模板,例如std::unique_ptr、std::shared_ptr等来表示对象的所有权。Delphi的标准库中是否有类似的内容?在编写代码时,是否有任何表达对象所有权的最佳实践应该遵循? 编辑:自从C++11成为标准以来,出现了两个轻量级辅助类st...

7得票3回答
什么是unique_ptr中拥有对象的唯一所有权意味着什么?

我知道std::unique_ptr用于在对象只有一个所有者时使用,std::shared_ptr用于在对象有多个所有者时使用。成为对象的唯一所有者是什么意思? 成为唯一的所有者是否意味着其他人不能看到这个对象? 当将指针作为引用传递时,我可以使用get()方法返回原始指针吗? 如果我必...