问题标签 [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 投票
2 回答
81 浏览

c++ - 扩展/增加智能指针的引用计数

假设我有一个定义shared_ptr. 方法完成后,shared_ptr也将被删除。在此期间,我有另一个成员使用它shared_ptr。所以我想延长shared_ptr过去初始方法的生命周期。

在此示例中是否可以手动将 a 的引用计数增加一?

some_delayed_method()就像一个支队,指的是a在返回之后的时间initial_method()

0 投票
1 回答
183 浏览

swift - 在 DispatchQueue 中使用弱自身

这是一个简单的 API 类,如下所示。

当我们fetchData在下面的代码中调用时,我们使用[weak self]来防止保留循环。
DispatchQueueue.main.async用来更新主线程中的 UI。
我也需要在[weak self]这里吗?
哪一个是对的,fooA还是fooB

0 投票
0 回答
168 浏览

kotlin - 如何释放由 Cleaner 管理的资源的所有权?

假设我有一个像这样的包装对象:

现在假设我想编写一个方法internal fun release(): Ptr,让Resource放弃所有权nativePtr然后返回它:换句话说,当Resource我调用release的对象被垃圾收集时,它的nativePtr指针不应该被释放。Resource(我打算在调用之后不应该使用该对象release,尽管我看不到任何强制执行此操作的方法。)这将允许我将 传递Ptr给一个 API,该 API 将从那时起管理其生命周期。

我该如何编写release,最好以原子/线程安全的方式编写?它甚至兼容Cleaner吗?

0 投票
0 回答
31 浏览

c++ - 对象初始化时与智能指针共享所有权

我有一个类A,它有一个指向类的成员指针B

在我的main函数中,我创建了一个shared_ptrA,然后使用这两个类的一些方法。

但是,在使用 , 的方法之前Bfunc1()我想重置spA指针。但是spA指向的对象,还不允许被销毁(设计要求,因为指向的对象spB可以持有对某些A成员的引用)。

为了能够做到这一点,我认为B还可以持有一个指针A,让我们说A* m_A。但是由于B是从A的构造函数创建的,所以还没有A对象需要初始化m_A

传入thisA构造函数 tocreateB(this)并不能解决问题,因为它不与spA在第一行创建的共享所有权main(),所以它不会阻止指向的对象spA在 之后被完全销毁spA.reset()

我的另一种选择是创建m_A一个shared_ptr, 但将' 的构造函数传递给shared_from_this()要么是不可能的,因为该对象尚未创建。AcreateB(this->shared_from_this())A

你对如何解决这个问题有什么建议吗?

0 投票
2 回答
148 浏览

c++ - 只要另一个对象存在,如何使一个对象保持活动状态?

有没有办法防止一个特定对象在另一个对象仍然存在时被销毁,而无需明确地让第二个对象的类知道第一个对象?

这是一个例子:

之后spA.reset(),我希望至少有一个对指向的对象的引用spA。或者,换句话说:我spA只想在调用spB->DoSomething().

但是,一个重要的先决条件是B不允许“知道”的A(例如,不允许持有指向它的指针/引用)。

据我了解,共享指针提供了一些可以帮助解决此问题的功能,但我不确定是哪一个。

编辑:

A的简要结构B如下:

EDIT2(我的解决方案):

因此,使用@MSalters 提供的建议,我能够找到适合我的解决方案。在这种情况下,它比预期的要简单得多,因此我只需要调整A::getB()

m_B在这里,不仅仅是返回,而是创建并返回一个类型A::getB()的共享指针(使用别名构造函数),这会影响对象的引用计数(由 提供)。因此,调用从二到一的使用减少,使调用成为可能。要使用,需要继承自:spBAliasBAthis->shared_from_this()spA.reset()mainspAspB->DoSomething()shared_from_this()Astd::enable_shared_from_this<A>

0 投票
2 回答
69 浏览

c++ - 在 push_back 被称为未定义行为之后,将 std::span 用于 std::vector

我的理解std::span是它本质上包含指向容器的指针、大小和一些有用的成员函数。

如this question所示,我可以采用一个向量的跨度。

如果我将条目添加到向量的末尾,则可能需要调整向量的大小。调整矢量大小时,会发生以下步骤(顺序不重要)。

  1. 在具有更多空间的堆上分配了一个新数组。

  2. 向量中的条目被移动到新数组中。

  3. 到's 数组ptr的成员更改为新数组的开头。vectorvector

  4. 旧数组被释放。

span如果vector' 的数组需要重新分配并变大,会发生什么情况吗?是否在未定义的行为上调用了spaninto a vectorafter ?push_backvector

0 投票
2 回答
96 浏览

c++ - 有没有办法在析构函数中删除一个没有用 new 运算符分配的指针?如果是这样,我应该在析构函数中删除它吗?

例如,

在这种情况下,有什么方法可以在析构函数中删除 foo 吗?我是否必须在析构函数中删除 foo 或至少将其设置为 nullptr?