- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这段代码运行良好,但在 Rust nightly (1.2) 上会给出编译器警告
#[repr(C)]
struct DbaxCell {
cell: *const c_void
}
#[link(name="CDbax", kind="dylib")]
extern {
fn new_dCell(d: c_double) -> *const c_void;
fn deleteCell(c: *const c_void);
}
impl DbaxCell {
fn new(x: f64) -> DbaxCell {
unsafe {
DbaxCell { cell: new_dCell(x) }
}
}
}
impl Drop for DbaxCell {
fn drop(&mut self) {
unsafe {
deleteCell(self.cell);
}
}
}
它链接到 C 库并正确创建/删除单元对象。但是它会发出警告
src\lib.rs:27:1: 33:2 warning: implementing Drop adds hidden state to types, possibly conflicting with `#[repr(C)]`, #[warn(drop_with_repr_extern)] on by default
\src\lib.rs:27 impl Drop for DbaxCell {
\src\lib.rs:28 fn drop(&mut self) {
\src\lib.rs:29 unsafe {
\src\lib.rs:30 deleteCell(self.cell);
\src\lib.rs:31 }
\src\lib.rs:32 }
确保正确清理这些 DbaxCell
并且不发出警告的正确方法是什么?
最佳答案
我认为您将两个概念混为一谈。如果您希望结构的布局直接对应到结构的布局,则结构应该是 repr(C)
,因为 C 编译器会对其进行布局。也就是说,它具有相同的内存中 repr
esentation。
但是,如果您只是持有一个原始指针,并且不打算将持有结构传递回 C,那么您不需要。在这种情况下,简短的解决方案是“删除 repr(C)
".
解释一下这个错误...
implementing Drop adds hidden state to types, possibly conflicting with
#[repr(C)]
这已在 issue 24585 中讨论过.当一个对象被丢弃时,会设置一个隐藏标志(“状态”),指示该对象已被丢弃,从而防止发生多次丢弃。但是,隐藏位意味着您在 Rust 中看到的内容与在 C 中的结构字节不对应,这否定了 repr(C)
的目的。
作为 cribbed from @bluss :
Low level programmers, don't worry: future Rust will remove this drop flag entirely.
和
Use
repr(C)
to pass structs in FFI, and useDrop
on "regular Rust" structs if you need to. If you need both, embed therepr(C)
struct inside the regular struct.
假设我们有一个库,它公开了一个带有两个 8 位数字的 C 结构,以及获取和返回该结构的方法:
typedef struct {
char a;
char b;
} tuple_t;
tuple_t tuple_increment(tuple_t position);
在这种情况下,您肯定想模仿该结构并匹配 Rust 中的 C 表示:
#[repr(C)]
struct Tuple {
a: libc::char,
b: libc::char,
}
但是,如果库返回了指向结构的指针,并且您永远不需要插入它(结构是不透明),那么您无需担心 repr(C )
:
void tuple_increment(tuple_t *position);
然后你可以使用那个指针并实现 Drop:
struct TuplePointer(*mut libc::c_void);
impl Drop for TuplePointer {
// Call the appropriate free function from the library
}
关于使用 Drop trait 释放 repr(C) 结构的正确习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30742004/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!