问题标签 [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.
c++ - 扩展/增加智能指针的引用计数
假设我有一个定义shared_ptr
. 方法完成后,shared_ptr
也将被删除。在此期间,我有另一个成员使用它shared_ptr
。所以我想延长shared_ptr
过去初始方法的生命周期。
在此示例中是否可以手动将 a 的引用计数增加一?
some_delayed_method()
就像一个支队,指的是a
在返回之后的时间initial_method()
。
swift - 在 DispatchQueue 中使用弱自身
这是一个简单的 API 类,如下所示。
当我们fetchData
在下面的代码中调用时,我们使用[weak self]
来防止保留循环。
我DispatchQueueue.main.async
用来更新主线程中的 UI。
我也需要在[weak self]
这里吗?
哪一个是对的,fooA
还是fooB
?
kotlin - 如何释放由 Cleaner 管理的资源的所有权?
假设我有一个像这样的包装对象:
现在假设我想编写一个方法internal fun release(): Ptr
,让Resource
放弃所有权nativePtr
然后返回它:换句话说,当Resource
我调用release
的对象被垃圾收集时,它的nativePtr
指针不应该被释放。Resource
(我打算在调用之后不应该使用该对象release
,尽管我看不到任何强制执行此操作的方法。)这将允许我将 传递Ptr
给一个 API,该 API 将从那时起管理其生命周期。
我该如何编写release
,最好以原子/线程安全的方式编写?它甚至兼容Cleaner
吗?
c++ - 对象初始化时与智能指针共享所有权
我有一个类A
,它有一个指向类的成员指针B
:
在我的main
函数中,我创建了一个shared_ptr
类A
,然后使用这两个类的一些方法。
但是,在使用 , 的方法之前B
,func1()
我想重置spA
指针。但是spA
指向的对象,还不允许被销毁(设计要求,因为指向的对象spB
可以持有对某些A
成员的引用)。
为了能够做到这一点,我认为B
还可以持有一个指针A
,让我们说A* m_A
。但是由于B
是从A
的构造函数创建的,所以还没有A
对象需要初始化m_A
。
传入this
的A
构造函数 tocreateB(this)
并不能解决问题,因为它不与spA
在第一行创建的共享所有权main()
,所以它不会阻止指向的对象spA
在 之后被完全销毁spA.reset()
。
我的另一种选择是创建m_A
一个shared_ptr
, 但将' 的构造函数传递给shared_from_this()
要么是不可能的,因为该对象尚未创建。A
createB(this->shared_from_this())
A
你对如何解决这个问题有什么建议吗?
c++ - 只要另一个对象存在,如何使一个对象保持活动状态?
有没有办法防止一个特定对象在另一个对象仍然存在时被销毁,而无需明确地让第二个对象的类知道第一个对象?
这是一个例子:
之后spA.reset()
,我希望至少有一个对指向的对象的引用spA
。或者,换句话说:我spA
只想在调用spB->DoSomething()
.
但是,一个重要的先决条件是B
不允许“知道”的A
(例如,不允许持有指向它的指针/引用)。
据我了解,共享指针提供了一些可以帮助解决此问题的功能,但我不确定是哪一个。
编辑:
A
的简要结构B
如下:
EDIT2(我的解决方案):
因此,使用@MSalters 提供的建议,我能够找到适合我的解决方案。在这种情况下,它比预期的要简单得多,因此我只需要调整A::getB()
:
m_B
在这里,不仅仅是返回,而是创建并返回一个类型A::getB()
的共享指针(使用别名构造函数),这会影响对象的引用计数(由 提供)。因此,调用从二到一的使用减少,使调用成为可能。要使用,需要继承自:spBAlias
B
A
this->shared_from_this()
spA.reset()
main
spA
spB->DoSomething()
shared_from_this()
A
std::enable_shared_from_this<A>
c++ - 在 push_back 被称为未定义行为之后,将 std::span 用于 std::vector
我的理解std::span
是它本质上包含指向容器的指针、大小和一些有用的成员函数。
如this question所示,我可以采用一个向量的跨度。
如果我将条目添加到向量的末尾,则可能需要调整向量的大小。调整矢量大小时,会发生以下步骤(顺序不重要)。
在具有更多空间的堆上分配了一个新数组。
向量中的条目被移动到新数组中。
到's 数组
ptr
的成员更改为新数组的开头。vector
vector
旧数组被释放。
span
如果vector
' 的数组需要重新分配并变大,会发生什么情况吗?是否在未定义的行为上调用了span
into a vector
after ?push_back
vector
c++ - 有没有办法在析构函数中删除一个没有用 new 运算符分配的指针?如果是这样,我应该在析构函数中删除它吗?
例如,
在这种情况下,有什么方法可以在析构函数中删除 foo 吗?我是否必须在析构函数中删除 foo 或至少将其设置为 nullptr?