问题标签 [errata]
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 - 在“关于 size_t 和 ptrdiff_t”中解释这段话
在安德烈·卡尔波夫(Andrey Karpov)题为“关于size_t
和ptrdiff_t
”的博文中,他总结道
正如读者所见,使用 ptrdiff_t 和 size_t 类型为 64 位程序提供了一些优势。但是,它不是用 size_t 替换所有无符号类型的全面解决方案。首先,它不能保证程序在 64 位系统上的正确运行。其次,很可能由于这种替换,会出现新的错误,违反数据格式兼容性等等。您不应该忘记,在此替换之后,程序所需的内存大小也会大大增加。必要内存大小的增加会减慢应用程序的工作,因为缓存将存储更少的正在处理的对象。
我不理解这些说法,也没有在文章中看到它们,
“很有可能因为这个替换,会出现新的错误,违反数据格式兼容性等等。”
这怎么可能,在迁移和类型迁移导致错误之前怎么可能没有错误?目前尚不清楚类型 (size_t
和ptrdiff_t
) 何时似乎比它们要替换的类型更具限制性。
您不应该忘记,在此替换之后,程序所需的内存大小也会大大增加。
我不清楚所需的内存大小如何或为什么会“大大”增加或根本增加?我明白,如果它确实如此,安德烈的结论就会随之而来。
c - 对于遍历数组,我们应该使用 size_t 还是 ptrdiff_t?
在Andrey Karpov 题为“关于和”的这篇博客文章中,size_t
ptrdiff_t
他展示了一个例子,
但是,我不确定这是否正确,似乎应该是
这个对吗?
我知道我们也应该使用类似的东西memset
,但让我们完全避免这种情况。我只问类型
c - 数组语法与指针语法和代码生成?
在Richard Reese的《理解和使用 C 指针》一书中,它在第 85 页上说,
生成的代码与生成的
vector[i]
代码不同*(vector+i)
。该符号vector[i]
生成从位置向量开始的机器代码,从该位置移动i
位置,并使用其内容。该符号*(vector+i)
生成从 location 开始的机器代码vector
,添加i
到地址,然后使用该地址的内容。虽然结果相同,但生成的机器代码不同。这种差异对大多数程序员来说并不重要。
你可以在这里看到摘录。这段话是什么意思?在什么情况下,任何编译器都会为这两者生成不同的代码?从基地“移动”和“添加”到基地有区别吗?我无法让它在 GCC 上工作——生成不同的机器代码。
openshift - OpenShift 上的 RHEL Atomic Image:安装安全更新
我正在努力修复我们的应用程序的安全漏洞,该应用程序部署在我们客户的 OpenShift 集群上。
具体来说,我们需要安装这些更新:
我们正在尝试将 RHEL 7 Atomic ( registry.access.redhat.com/rhel7-atomic:latest
) 作为新的基础映像,但我仍然找不到正确的命令和配置来应用更新。
以下是构建应用程序 Docker 映像时的示例命令结果:
另一种尝试:
有人可以建议下一步在哪里看吗?谢谢!
最好的问候, Chakrit W.
c++ - C++ Primer 第 5 版第 16.5 章类模板专业化
我认为这本书在第 711 页有一个错误:
在第 16.2.3 节(第 684 页)中,我们介绍了库
remove_reference
类型。该模板通过一系列专业化工作:...
所有三个变量 ,
a
和b
,c
都具有类型int
。
我认为会decltype(i)
产生一个普通的int
,int&
因此在b
. 对于普通变量类型[1],decltype
类型说明符产生普通类型,而对于其他可以用作lvalue
的表达式,它将产生和lvalue reference
。
例子
编译并运行
请告诉我我是对还是错,并在适当的时候解释一下。
谢谢
[1]可能正确的术语是id-expression
?
c++ - 在 C++ Primer 第 5 版 shared_ptr 中发现错误
嗨,我正在阅读 C++ 入门第 5 版,我想我在 shared_ptr 部分下发现了一个错误。首先,我正在编写代码和他们给出的解释。然后我会写出我认为是错误的内容以及我认为实际发生的事情。代码如下:
他们给出的解释如下:
在这种情况下,p 和 q 都指向同一个内存。因为它们是彼此独立创建的,所以每个引用计数为 1。当定义 q 的块结束时,q 被销毁。销毁 q 会释放 q 指向的内存。这使得 p 成为一个悬空指针,这意味着当我们尝试使用 p 时发生的事情是未定义的。此外,当 p 被销毁时,指向该内存的指针将被第二次删除。
现在我认为错误是“当定义 q 的块结束时,q 被销毁。销毁 q 释放 q 指向的内存。 ”以及他们给出的为什么 p 是悬空指针的原因是错误的。以下是我为什么 p 是一个悬空指针以及为什么第一个引用的语句是错误的推理。
- 当定义 q 的块结束时,
q
被销毁。q
但是没有释放指向的内存q
是内置指针而不是shared_ptr。而且除非我们显式地写deleteq
,否则相应的内存不会被释放。 - 现在,在新块中,我们使用 q 创建了一个临时 shared_ptr。但这个暂时是独立的
p
。所以当这个内部块结束时,临时被破坏,因此内存被释放。但请注意,它p
仍然指向已释放的相同内存。所以p
现在是一个悬空指针,并且p
在语句中使用int foo=*p
是未定义的。
我认为这是对为什么 p 是悬空指针的正确解释,也是应该存在的更正。有人可以确认这是正确的还是我做错了什么?