Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么BufWriter将内部写入包装在一个选项中?_Rust - Fatal编程技术网

Rust 为什么BufWriter将内部写入包装在一个选项中?

Rust 为什么BufWriter将内部写入包装在一个选项中?,rust,Rust,在标准库中,BufWriter声明如下: pub struct BufWriter<W: Write> { inner: Option<W>, buf: Vec<u8>, // #30888: If the inner writer panics in a call to write, we don't want to // write the buffered data a second time in BufWriter's

在标准库中,
BufWriter
声明如下:

pub struct BufWriter<W: Write> {
    inner: Option<W>,
    buf: Vec<u8>,
    // #30888: If the inner writer panics in a call to write, we don't want to
    // write the buffered data a second time in BufWriter's destructor. This
    // flag tells the Drop impl if it should skip the flush.
    panicked: bool,
}
pub结构BufWriter{
内部:选项,
buf:Vec,
//#30888:如果内心的作者在打电话要求写作时惊慌失措,我们不想这样做
//在BufWriter的析构函数中再次写入缓冲数据
//标志告诉Drop impl是否应跳过刷新。
惊慌失措:布尔,
}

正如文档所告诉我们的,
惊慌失措
作为一种安全措施存在,可以防止在展开时重复写入,我理解其背后的原因。内部写入程序被包装在
选项中是否有类似的原因?我在代码中发现,
选项
实际上被清除的唯一部分是在中,但我看不出为什么裸值以及按值取的
self
也不可能做到这一点。

原因很简单:
BufWriter
实现
Drop
,并且不能从实现
Drop
的类型移出字段。就在
BufWriter::into_internal
返回之前,调用
BufWriter::drop
,因为
BufWriter
被移动到函数的
self
参数中,然后超出范围–这是标准RAII


如果你能移出一个区域,那么析构函数会发生什么?要么它根本不会被调用,这会令人惊讶,要么它会被一些包含无效值的字段调用,这可能会违反内存安全。

我没有想到这一点。那么你能用这个选项来防止恐慌吗?也就是说,暂时把内部的编写器取下来,然后再还给我,而不是
self.panicked=true
,但这可能会稍微贵一点,因为它需要制作两份
W
(其大小我们不知道)的(浅)副本。另一方面,
panicked
字段的长度为一个字节,因此它是一个已知的、较小的固定成本。相关:几天前被关闭为
延期
。这也是相关的。