问题标签 [ownership-semantics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
103 浏览

memory-management - 为什么这个函数返回一个(拥有的)值?

代码来自:Genie 如何将字符串作为字符串数组重复 N 次 Genie 如何将字符串作为字符串数组重复 N 次

var a是一个局部变量,当a超出范围时,它将被销毁。为什么这个功能

返回(拥有)a.str

有什么区别

返回一个.str

返回(拥有)a.str

(拥有的)有什么好处

0 投票
1 回答
115 浏览

rust - 何时为不再拥有的资源回收存储?

在下面程序的第 2 行中分配了一个向量资源。当程序结束时,向量资源不属于自己。如果一个资源根本不拥有,它什么时候被回收?是否有使用 Rust 所有权语义和生命周期术语的解释,可以让程序员相信该资源确实被回收了?

0 投票
1 回答
2304 浏览

iterator - Rust 可以使用传递给函数的迭代器吗?

我正在尝试在 Rust 中实现一个简单的 REPL 计算器,而且我到处都是砖墙。

我在遍历硬编码字符串时使用了字符。当我点击一个数字字符时,我想将控制权传递给一个函数,该函数将消耗数字的其余部分(假设该数字有多个数字)并返回该数字,转换为一个整数。

我在将Chars迭代器传递给函数时遇到了麻烦。我得到的错误是use of moved value: 'iter'.

我知道我不能改变我给别人的东西——它的所有权被转移的东西——但我不知道有什么其他的方法可以做到这一点,特别是因为 Chars 迭代器是不可复制的。

0 投票
1 回答
2042 浏览

rust - Rust 如何移动不可复制的堆栈变量?

这里有一个很好的 Rust 移动语义示例:Rust By Example 网站上的Rust Move Semantics 。

我对这两种情况都有基本的了解。第一个是原语如何具有新的别名并且仍然可以使用原始别名,因为最终结果是副本视为i32利用了该Copy特征。这对我来说很有意义。

i32此外,由于许多充分的理由,第二个示例在具有多个引用堆上的别名方面是有意义的。Rust 强制执行所有权规则,因此现在已经创建了新绑定,因此无法使用原始别名。这有助于防止数据竞争、双重释放等。

但似乎还有第三种情况没有被讨论。Rust 如何实现未实现Copy特征的堆栈分配结构的移动? 用以下代码说明了这一点:

我知道:在上述情况下,Rust 将Employee在堆栈上分配。上述结构没有实现Copy特征,因此在分配给新别名时不会被复制。这让我很困惑,因为如果Employee结构在堆栈上分配并且也没有实现Copy特征它在哪里/如何移动?它物理上是否移动到do_something()的堆栈帧?

感谢您在解释这个难题时提供任何帮助。

0 投票
1 回答
332 浏览

rust - Rust 集合是否有能力拥有它们存储的数据?

给定以下代码(不编译):

我创建了一个绑定到 RustString类型的变量,它将超出第一组花括号的范围。有没有办法以某种方式移动字符串的所有权,以便向量本身拥有它?

这是一个任意示例,但我只是想了解这个概念是否可行。

我已经知道,如果我使用字符串文字,这将被视为一个静态字符串,它将在整个应用程序的生命周期中存在,因此这段代码可以编译,但我只是想了解 Rust 中的集合是否可以拥有数据. 我知道 Rust 不是 Objective-C,但 Objective-C 具有能够保留数据的集合。

0 投票
3 回答
2430 浏览

rust - 将字符串克隆到特定生命周期

我目前正在尝试用 Rust 编写一个小命令行应用程序,但我遇到了生命周期的障碍。

问题是我试图传递username给默认值方法,这需要str一个生命周期为'r. 我试过克隆,但我不知道如何告诉它克隆的生命周期是多少。我尝试了以下几行:

出于某种原因,它现在告诉我它的username寿命不够长,尽管自从我克隆了数据以来这并不重要。

所以我的问题是,我该如何编译?

编辑:我想补充一点,除了生命周期参数之外,签名保持不变对我来说很重要。我不介意进行昂贵的操作,例如克隆来完成这项工作。

0 投票
0 回答
219 浏览

winapi - 通过 Rust FFI 编码 WinApi 的更强安全性

我正在玩winapi crate,但在我看来,它并没有为 Windows API 添加安全性——它似乎只是提供类型和签名,并允许我们以几乎相同的不安全范式进行编程,但使用 Rust句法。

例如,是否有可能在 Rust FFI 中进一步细分原生类型以编码隐式生命周期信息,以便 winapi 编程实际上更安全?当 winapi 分配给必须通过某些调用释放/释放的指针或句柄时,我们可以Drop为该值附加正确的行为吗?Rust 是否足够富有表现力?

当然,我们可以使用在调用者和 winapi 之间映射的更安全的对象来完全包装 winapi 调用,但这会在复制/映射期间导致运行时命中,这并不好玩。

(也许很清楚,但我对 Rust 和 WinApi 甚至原生编程都是新手。)

我意识到通常必须将字符串数据转换为 Rust 的 UTF-8。但是我想知道是否有可能自动将本机字符串包装在一个记忆结构中,其中字符串不会被转换为 UTF-8(透明地),除非在 Rust 代码中需要它(而不是作为相同的格式)。

句柄和指针虽然不需要任何转换,但它们只需要正确的生命周期。但是有很多种指针和多种句柄,这些类型差异应该在 Rust 中保留。但是然后用特征 impl 对特定于库的 free() 进行编码,Drop我认为会有很多排列,然后我们需要对其他不关心谁分配它的 winapi 函数进行重载。正确的?

0 投票
5 回答
739 浏览

c++ - Accessing owner in destructor c++

Say there is an object A which owns an object B via std::unique_ptr<B>. Further B holds a raw pointer(weak) reference to A. Then the destructor of A will invoke the destructor of B, since it owns it.

What will be a safe way to access A in the destructor of B? (since we may also be in the destructor of A).

A safe way me be to explicitly reset the strong reference to B in the destructor of A, so that B is destroyed in a predictable manner, but what's the general best practice?

0 投票
3 回答
4123 浏览

rust - 如何重复使用已将值移出的盒子?

我有一些不可复制的类型和一个消耗和(也许)产生它的函数:

现在考虑一种在概念上非常类似于的类型Box

我们可以编写一个函数来临时移出 的内容NotBox并在返回之前将其放回:

我想编写一个与Boxes 一起使用的类似函数,但编译器不喜欢它:

我可以返回Some(Box::new(new_foo)),但这会执行不必​​要的分配 - 我已经有一些内存可供使用!有可能避免这种情况吗?

我也想摆脱这些match语句,但编译器再次对它不满意(即使是NotBox版本):

有可能解决这个问题吗?

0 投票
2 回答
1913 浏览

c++ - 父子类的C++共享指针

我有一个场景,我需要在一个集合中收集一个类型的所有对象,但我还需要一个它的一些继承类型的集合。例子:

然而,当我想销毁这些对象时,我实际上为每个 ChargedPartice 调用了两次析构函数:

我怎样才能将子对象的集合存储在其静态容器中,并让它们的父类之一指向它们的智能指针?

我也希望能够从父类创建对象,并让父类的静态智能指针向量成为这些对象的所有者。

我的想法是,当对象不是子类集合的元素时,我以某种方式为仅调用析构函数的父类智能指针定义了一个自定义删除器。这可能吗?