- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Rust 比较陌生。我正在研究一些无锁算法,并开始尝试手动管理内存,类似于 C++ new/delete。我注意到在整个标准库组件中有几种不同的方法可以做到这一点,但我想真正了解每种方法的差异和用例。这就是我的感觉:ManuallyDrop<Box<T>>
将阻止 Box 的析构函数运行。我可以保存指向 ManuallyDrop
的原始指针元素,并让实际元素超出范围(通常在 Rust 中会被删除)而不被删除。我可以稍后调用 ManuallyDrop::drop(&mut *ptr)
手动删除此值。
我也可以取消引用 ManuallyDrop<Box<T>>
元素,保存一个指向 Box<T>
的原始指针,然后调用 std::ptr::drop_in_place(box_ptr)
.这应该会破坏 Box
本身并删除堆分配的T
.
看着ManuallyDrop::drop
实现,看起来那些实际上是在做完全相同的事情。由于ManuallyDrop
是零成本,只是在它的结构中存储一个值,上述两种方法有什么区别吗?
我也可以调用std::alloc::Global.dealloc(...)
,看起来它会在不调用 drop 的情况下释放内存块。因此,如果我在指向 Box<T>
的指针上调用它,它将释放堆指针,但不会调用 drop
, 所以 T
仍然会躺在堆上。我可以在指向 T
的指针上调用它本身,这将删除 T
.
通过探索标准库,它看起来像 Global.dealloc
在 raw_vec
中调用实际删除 Vec
的堆分配数组的实现指着。这是有道理的,因为它实际上是在尝试删除一 block 内存。Rc
有一个大致如下所示的 drop 实现:
// destroy the contained object
ptr::drop_in_place(self.ptr.as_mut());
// remove the implicit "strong weak" pointer now that we've
// destroyed the contents.
self.dec_weak();
if self.weak() == 0 {
Global.dealloc(self.ptr.cast(), Layout::for_value(self.ptr.as_ref()));
}
我真的不明白为什么它需要
dealloc
和
drop_in_place
.
dealloc
是什么意思添加
drop_in_place
不行吗?
Box::new(5).into_raw()
之类的操作来保存指向堆分配值的原始指针,我的指针现在是否控制该内存分配。如,在我明确调用
ptr::drop_in_place()
之前它会一直存在吗? ?
ManuallyDrop::drop
或
ptr::drop_in_place
在我的原始指针上,然后我尝试运行
println!
在指针的取消引用值上。有时我得到一个可怕的堆错误,我的测试失败了,这是我所期望的。其他时候,它只打印相同的值,就好像没有发生任何下降一样。我也试过运行
ManuallyDrop::drop
多次在完全相同的值上,同样的事情。有时是堆错误,有时完全没问题,并且打印出相同的值。
最佳答案
如果你来自C++,你可以想到drop_in_place
就像手动调用析构函数一样,dealloc
调用旧 C free
.
它们有不同的用途:
drop_in_place
只需调用Drop::drop
,释放你的类型持有的资源。 dealloc
释放由指针指向的内存,之前用 alloc
分配. drop_in_place
也释放内存,但事实并非如此。我认为你的困惑是因为
Box<T>
包含一个动态分配的对象,所以它的
Box::drop
在调用它的
drop_in_place
之后,实现确实释放了该对象使用的内存。 , 当然。
Rc
中看到的内容。实现,首先它调用
drop_in_place
(析构函数)内部对象,然后它释放内存。
drop_in_place
会发生什么连续几次......好吧,这个函数不安全是有原因的:你很可能会得到未定义的行为。从文档:
...if T is not
Copy
, using the pointed-to value after callingdrop_in_place
can cause undefined behavior.
can cause
.我认为完全可以编写一个允许调用
drop
的类型。几次,但这听起来不是一个好主意。
关于pointers - Rust Global.dealloc vs ptr::drop_in_place vs ManuallyDrop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62917242/
演讲的主题是 Objective-c 中的类和对象。我无法理解 [super dealloc] 的概念。我们有一些类 myClass,它继承自 NSObject。它有一些方法并从父类继承其他方法。所以
对于 ARC,有时我仍然需要编写一个 -dealloc 方法来进行一些清理。在极少数情况下,我需要引用实例的属性才能正确进行清理。例如从 NSNotificationCenter 中注销给定的发送者对
如果我有一个由 View Controller 控制的 View 堆栈,并且当我从 View 堆栈中弹出 View 时调用了 View 的 dealloc(包含 [super dealloc] )方法
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve
当我的应用程序开始在我的自定义注释方法中崩溃时,我了解到我的内存有问题。我确信管理 map 的 viewcontroller 100% 应该已经从 View 堆栈中弹出。 这里是注释的代码,TaxiA
我刚刚一直在阅读有关如何正确地在 init 方法中失败的信息,并且文档似乎彼此不同意。一个建议抛出异常,而其他建议清理并返回 nil。当前的最佳做法是什么? 最佳答案 我相信普遍接受的做法是在失败时返
这是我的情况。这很复杂,所以请耐心等待。 我有一个 View 类,我们称它为 MyView。它创建一个加载指示器 subview ,然后启动将加载数据的后台操作。它还创建了一个 block ,后台队列
我正在设置 AMScrollingNavbar在 swift 。当我尝试转换时 - (void)dealloc { [self stopFollowingScrollView]; } 到 func
我正在尝试执行以下操作: 获得类'dealloc IMP 向所述类中注入(inject)一个自定义 IMP,它基本上调用原始的 dealloc IMP 当所述类的一个实例被释放时,两个 IMP 都应该
在我的一个 View Controller 中,它将自身添加为 UITextViewTextDidEndEditingNotification 通知的观察者,如下所示 [[NSNotification
我正在初始化一个对象,然后内联配置它。但是,不是在配置前一个实例(如果之前已分配)之前将其释放(在紧随其后的行中),而是推迟释放。因此,我对它所做的所有配置最终都成为一个已释放的对象 - 这当然不是我
是否需要将所有声明为IBOutlet的带有retain修饰符的@property设置为nil - (void)dealloc 方法?如果我不这样做,内存会被消耗/浪费吗? 假设自动引用计数关闭。 最佳
这是我在应用程序中切换 View 的方式: CGRect frame = self.view.frame; frame.origin.x = CGRectGetMaxX(frame);
假设有一个带有两个选项卡 A 和 B 的选项卡栏 Controller ,其中 A 是导航 Controller 。 当用户在A中时,他可以推送A1,然后推送A2,它们都是 View Controll
我有一个加载两个 View Controller 的 Root View 。例如:FirstVC、SecondVC。 当应用程序启动时,我将 FirstVC 显示为 Root View Control
我有一个基于导航的应用程序,可以在一些 ViewController 之间切换。如果我按下“goHome”按钮,方法 popViewControllerAnimated: 被调用,然后我返回到主屏幕。
我正在尝试调试为什么我的 dealloc 覆盖没有在我的一个 View Controller 上被调用。 我有一个通过 Storyboard设置的 View Controller 。我已经重写了所有
对于我的 iOS 7 应用,只想确认: dealloc 是否仍会被调用? 与是否开启ARC有关系吗? 最佳答案 是的,无论您是否使用 ARC,dealloc 都会在对象被释放时调用。 但是请注意,当您
我很难适应 C++ 处理动态和自动内存的方式。 我的问题: 指向自动分配实例的指针是否可以保留该实例解除分配,即使实例化范围已离开? 在this帖子我读到所有指向 dealloc 内存的指针都是无效的
我有三个 UIViewControllers,每当我关闭它们时,它们的所有 dealloc 方法都会被调用。这正是我想要发生的事情,这样内存就不会膨胀。 但是,当我运行配置文件来测试内存使用情况和一些
我是一名优秀的程序员,十分优秀!