问题标签 [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.
pointers - 取消引用指向 String 的原始指针和指向 i32 的原始指针有什么区别?
上面的代码失败并出现错误:
为什么会发生String
而不是发生i32
?为什么抱怨“搬家”?
reference - 为什么 Option::map 不在 Iterator::next 的链表实现中取得所有权?
我正在尝试跟随Rust With Entirely Too Many Linked Lists。
实施iter
时,
在该next
方法中,map
采用Option
按值,因此它需要采用self.next
恰好是Option<&Node<T>>
按值类型的。这不会“窃取”价值吗?
由于闭包是一个变异闭包,它不应该需要完全访问self
并且这段代码不应该编译吗?我在这里错过了什么吗?
rust - 派生 PartialEq 时,无法移出包含盒装特征对象的枚举上的借用内容
我正在尝试编写一个枚举派生PartialEq
,其中包含一个手动执行的特征对象。我在这里使用了解决方案,以强制实现者Trait
编写相等方法。这无法编译:
这仅在我手动编译时编译impl PartialEq for Enum
。为什么会这样?
rust - 为什么 Rust 书将一个变量分配给另一个变量作为复制顶层结构?
在Rust 编程语言中关于所有权的部分中,String
s 表示为具有 3 个字段的结构(3 个字段之一是指向实际字节向量的指针)。有一个例子:
这本书将其解释为复制包含在s1
to中的 3 字段结构s2
(但不是字节向量),然后将包含在其中的结构标记s1
为“无效”(图 4-4)。
为什么它以这种方式呈现,而不是呈现s2
为指向相同的顶级结构s1
,然后标记s1
为“无效”?
这种替代呈现是否会导致语义上的明显差异(或者甚至会导致问题)?如果不是,是不是因为它更好地反映了底层实现?如果是这样,为什么实现会进行这样的复制操作?
c++11 - 当创建对象包含唯一指针的共享指针副本时会发生什么?
我一直在研究 SFML,想知道如何构建一个简单的 2D 游戏。我只是注意到这种行为,无法弄清楚发生了什么。让我困惑的示例代码:
此时,&sharedPtr->p == &ptrCopy->p
; 但它怎么可能,如果p
是类型unique_ptr<T>
?
c++ - 我可以检查 `shared_from_this` 是否可以安全调用?
shared_from_this
当从继承自的类型中调用时,如果对象当前没有持有(通常是应用程序崩溃)enable_shared_from_this
,则可能会发生非常糟糕的事情 (TM )。是否可以在 C++14(不是 17)中检查它是否安全?this
shared_ptr
编辑:不使用异常或尝试/捕获。
c++ - 如何在拥有的 C++ 对象中安全地存储对所有者的引用?
类通过Owner
拥有多个类对象。我希望对象存储对拥有它们的对象的引用(不是指针) ,具有以下要求:Item
unique_ptr
Item
Owner
永远不可能有一个悬空的参考。
itm
类对象中包含的引用Item
永远不会指向Owner
不拥有的对象itm
。一个
Item
对象总是有一个所有者。Item
类将通过其子类使用。
我尝试Item
在构造过程中自动注册类的对象(in Item::Item()
),但是当它们在堆栈上创建时会导致双重删除。因此,我可能需要防止在堆栈上创建它们。但是当我对它们进行子类化时,这是一个问题。有没有更简单的方法来确保相互链接始终正确,而不放宽任何要求?我怀疑 3. 可能必须放宽,以便首先创建对象并在Owner
后面注册它。
c++ - shared_ptr 到基本接口的初始化和管理
我有一些与使用指向基类的 shared_ptr 有关的问题。他们的答案相互影响,对于所有三个,我需要相同的代码片段以尽可能少的方式设置上下文,就像这样(所有问题都Foo
与它有关held_object_
):
如您所见cbaz
,它是一个指向多态层次结构的指针,它可以与Scene
和一起使用Foo
。ConcreteBaz
实际上代表一个物理实体,Foo
如代码中所述,可以拥有它(这是shared_ptr
因为两者都Scene
拥有Foo
它,根据this。我删除了这里的细节,Scene
因为它是 OT)。
问题
1)如何初始化held_object_
?我可以一次分配吗?
实际上,在它(物理上)获得它之前foo
并不拥有cbaz
它,因此构造函数应该初始化指向 nullptr 的指针。最初我想make_shared
按照这个使用,但我在这里读到它是值初始化的,这意味着如果我要这样做
编译器会抱怨error: invalid new-expression of abstract class type
. 因此,这将成为这个问题的副本,但接受的答案要么留下shared_ptr
未初始化的内容,要么进一步创建unique_ptr
......基本上不清楚我将如何在这里应用它,而且我认为我不能调用reset
构造函数(?) .
我是否应该明确地说
不关心make_shared
避免的双重分配?在这一点上,它不会几乎与 just 完全相同: held_object_ {}
(将 ctor 与默认 ctor 放在一边)?编辑:我也可以像这样用单一分配make_shared
来做吗?
2) 我该如何管理held_object_
?
现在要cbaz
在调用后获得所有权,acquire
我最终会调用方法
但是在release
我将不得不销毁拥有shared_ptr
(然后在下一个循环中再次设置它)并使我的Foo
实例的状态与其物理状态 IRL 保持一致。这让我想到了使用std::shared_ptr::reset(甚至在阅读之前的相关答案之前),因为如果我调用setHeldObject()
并设置cbaz
其他方式,我会用 nullptr 替换指针。但是我无法将方法主体的正确语法计算为:
this->held_object_.reset(object);
显然是错误的,因为我想管理指针,而不是指针(因此不会编译);this->held_object_.reset(&object);
看起来不对,并产生error: cannot convert ‘std::shared_ptr<Baz>*’ to ‘Baz*’ in initialization
this->held_object_.reset(object.get());
也似乎是错误的,因为我认为我不会以user_count
这种方式进行升级(尽管它确实可以编译)。
编辑:我相信应该可以用相同的方法调用来做到这一点,给出或不给出论点。那有可能reset
吗?
3)真的只有两个所有者
我在这里写的main
函数实际上是一个Process
类的run
方法,但是像这样定义它使得 use_count 到了 3Scene
并且Foo
有自己的shared_ptr
. 从我make_shared
开始,我就在一个循环中,而且逻辑上说应该只有两个所有者。这是一个用例,weak_ptr
在哪里可以有意义地做类似的事情:
或者,还有更好的方法?
c++ - 访问“父”或“所有者”函数 C++
我有一个类,Game
,它的参数 astd::vector
是另一个类的,Case
。在这个类Case
中,我有一个函数告诉我什么时候点击它。我想在按下a 时向我的对象发送一个信号Game
,该对象拥有。在 game.h 中:Cases
Case
在 case.h 中:
所以,当functionWhichIsCalledWhenCaseIsPressed()
被调用时,我想调用函数doSomething()
。编辑 :
我试过了,但我还需要从向量中创建一个案例......实际上,我的Case c;
Game.h 中有一个......而且我无法初始化它......我试过c = Game(*this);
但我有一个错误:
编辑:谢谢,完成了!
swift - 当被呈现的视图“拥有”时,Swift 无主的自我泄漏
在据我所知,不应该泄漏的情况下,我正在经历与无主的自我泄漏。让我举个例子,这有点做作,所以请耐心等待,我已经尽力制作最简单的案例。
假设我有一个简单的视图控制器,它在 viewDidLoad 上执行一个闭包:
和一个类,ViewHandler,它拥有这个视图控制器的一个实例,并使用一个无主引用将一个通知函数的调用注入到它的闭包中:
然后,当它的视图控制器由另一个视图控制器呈现时,ViewHandler 在被取消时泄漏:
我知道这个例子可能看起来有点做作,但据我所知不应该有泄漏。让我尝试分解它:
在呈现 ViewHandler.ViewController2 之前,所有权应如下所示:
呈现 ViewHandler.ViewController2 后,所有权应如下所示:
取消 ViewHandler 后,所有权应如下所示:
没有任何东西拥有 ViewHandler,它应该被释放。然而,情况并非如此,ViewHandler 正在泄漏。
如果我将注入到 onDidLoad 的闭包的捕获列表中的引用更改为弱,则没有泄漏并且 ViewHandler 按预期释放:
另外,我无法解释的事情是,如果我将引用保持为无主并使 ViewHandler 从 NSObject 继承,ViewHandler 将按预期释放并且没有泄漏:
任何人都可以解释发生了什么?