Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.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
Javascript node.js缓冲区不为空_Javascript_Node.js_Buffer - Fatal编程技术网

Javascript node.js缓冲区不为空

Javascript node.js缓冲区不为空,javascript,node.js,buffer,Javascript,Node.js,Buffer,当我创建大量的缓冲区时,它们并不总是空的: for (var i = 0; i < 100; i++) { console.log((new Buffer(30)).toString('hex')); } (部分)输出(无.toString('hex'),仅新缓冲区(10)): -->空的 -->空的 我正在32位Windows7机器上运行node.jsv0.10.33 这是我的特定机器的问题吗 这是node.js的一个常见问题(aka.bug)吗 这是否属于特殊组合的问题

当我创建大量的
缓冲区时,它们并不总是空的:

for (var i = 0; i < 100; i++) {
    console.log((new Buffer(30)).toString('hex'));
}
(部分)输出(无
.toString('hex')
,仅
新缓冲区(10)
):


-->空的
-->空的
我正在32位Windows7机器上运行node.js
v0.10.33

  • 这是我的特定机器的问题吗
  • 这是node.js的一个常见问题(aka.bug)吗
  • 这是否属于特殊组合的问题(例如,仅限Windows环境)
  • 这是预期的吗?在开始使用之前,我必须清除
    缓冲区
  • 这有文件记录吗
更新:
v0.11.14上表现更好,在
v0.8.28上表现更差;dr

  • 您的特定机器没有问题,所有机器上都有
  • 不是虫子。此行为存在于所有内存分配库中
  • 这不取决于操作系统。所有操作系统都是这样运行的
  • 如果需要初始化,则可以使用
    Buffer.prototype.fill
  • 是的,它记录在nodejs/webkit使用的底层库中:请参阅malloc(3)/stdlib
这很可能是在使用处理内存分配的API(如缓冲区)时所期望的

Buffer
实际上使用的是
smalloc
模块,您可以将其视为malloc(3)/free(3)fromstdlib.h

malloc背后的原理是,它只为指针分配/保留内存——在webkit中,它可能更接近对象上ExternalArray的calloc

函数的作用是:分配大小字节并返回指向 分配的内存内存未初始化。

内存分配/释放不处理内存初始化,因为遍历每个字节并将其设置为0的成本更高

此外,0并不总是字节所需的初始值

由于内存分配可以返回一个以前被其他进程使用过的内存块,所以新分配的块中应该有数据

一般规则是:在分配内存(如缓冲区)时,如果需要初始化它,则使用
buf.fill(0)
;虽然这并不总是需要的,因为在大多数情况下,当您需要缓冲区时,您已经知道数据的长度,隐式地知道内容

例如,当您创建
新缓冲区(30)
时,您知道您的数据有30个字节长,这意味着您已经知道要写入的数据是什么样子,因此最终很可能会写入每个字节,在将缓冲区传递给其他对象之前-因此无需预先附加一个将每个字节设置为0的初始化循环

对于使用字节作为对象的标志/状态的缓冲区,只能对其进行初始化

例如,如果您的
缓冲区(10)
使用前2个字节作为某些状态的标志,而使用其他8个字节作为数据,则只需这样做
buffer[0]=buffer[1]=0
,将它们设置为初始值0,而不是初始化所有10个字节,然后对最后8个字节进行写入


最后一点注意:如果内存分配返回的内存块以前没有使用过,那么是的,所有字节都设置为0。然而,内存处理是操作系统所做的事情——使用各种各样的优化——因此无法预测您将获得的内存段及其内容。

在Node(v5.10.0+)的最新版本中,您可以使用

--zero-fill-buffers

您是StackOverflow很棒的原因之一。谢谢你的回答。我想用零填充
缓冲区的原因是因为我正在实现一个Microsoft协议,它有很多保留字节。这看起来并不是我的答案。节点中的文档在哪里告诉它是一个特性(调用malloc的代码不是所谓的文档)?其确切行为取决于操作系统。内存是否初始化以及初始化内容由标准库支持节点的版本控制。在Windows上,调试生成将使用屏障初始化内存,以检测缓冲区溢出等情况。如果希望清除缓冲区,且不可能包含任何敏感数据,请使用。请注意,
newbuffer(size)
已被弃用。
<Buffer 01 00 00 00 58 db 62 00 b4 86>
<Buffer 90 b9 65 00 08 00 00 00 03 00>
<Buffer 10 ba 65 00 04 00 00 00 00 00>
<Buffer 04 00 00 00 00 00 00 00 00 00>
<Buffer 10 00 00 00 00 00 00 00 70 ba>
<Buffer 00 00 00 00 00 00 00 00 00 00> --> Empty
<Buffer 00 00 00 00 00 00 00 00 00 00> --> Empty
<Buffer ff ff ff ff ff ff ff ff 00 00>
<Buffer 00 00 00 00 0f 00 00 00 8c 6f>
<Buffer 80 ba 65 00 00 00 00 00 aa 00>
--zero-fill-buffers