V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  geelaw  ›  全部回复第 8 页 / 共 177 页
回复总数  3531
1 ... 4  5  6  7  8  9  10  11  12  13 ... 177  
new char[2,701,131,776] 会分配长度是 776 个元素的 char 数组,不是你期待的 2.51 GB 。

int main() { new char[2701131776] { }; }

这个程序在我的电脑上编译为 64 位的话可以正常运行,并且确实占用了 2.51 GB 内存,如果用 32 位编译器则编译失败,因为分配的数组规模超过了 size_t 。

抛出 std::bad_alloc 的意思就是分配失败,或许你的页面文件和实体内存不够大。

如果数据来自于文件,可以用内存映射文件,Windows 的文档是 https://learn.microsoft.com/en-us/windows/win32/memory/file-mapping
POSIX 的文档是 https://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html
> C 语言中打印指针的值打印的是 OS 分配的虚拟地址的值吗?

不是,它打印的是这个指针的整数表示。没有要求指针的整数表示必须等于操作系统级别的虚拟地址。当然,最常见的实现里,指针的整数表示就是它指向的对象的内存位置的虚拟地址。

> 要怎么知道 OS 给这个 C 程序进程分配的虚拟地址的大小呢?

操作系统不给“C 程序”分配虚拟地址,“虚拟地址”的大小可能也不是你想要的那个答案。操作系统为每个进程提供虚拟内存,每个程序都以为自己占有全部寻址空间的虚拟内存,虚拟地址的大小和处理器有关。

有意义的问题是:一个进程如何知道自己的虚拟内存里有多少页是可读的、可写的、可执行的?这个问题无法从 C 语言的抽象层级回答,你需要操作系统的 API 。

> 并且如何知道哪一块内存大小是可以读可以写,以避免出现下面程序的 Segmentation Fault 呢?

在 C 语言看来,只有 malloc 等分配得到且未 free 、realloc 等的、取静态存储期对象的地址得到的、取自动存储期对象地址得到且该对象还未离开作用域的指针,以及它进行有定义算术运算得到的指针,才是有效的指针。解引用无效指针的效果是未定义行为,段错误仅仅是它的一种表现方式。

当然,结合操作系统 API 之后有更多获得有效指针的方式。但楼主本来的这个问题意义不明——如果你不知道一个指针怎么来的,使用它有什么意义呢?如果你知道一个指针怎么来的,那你当然知道这个指针是否有效。
@geelaw #2 更正:隐式声明是 int system();

#11 空白的参数列表的意思是没有提供参数列表信息,并没有对不上。
system 是标准库函数,链接的时侯默认是带标准库的,所以找到了。

C 语言没有函数重载,不需要复杂的名称修饰,int system(…); 和 int system(char const *); 链接的时候去找的是同一个符号,前者是隐式声明的结果,后者是标准库的声明,故隐式声明的调用可以链接到标准库函数。
楼上已经说过 return 的时候 finally 会执行,把必须执行的代码写在 finally 里面而不是后面对阅读更好。另外就是

try { throw something; }
catch { throw; } // 重新 throw
finally { other; }
another;

里面 other 是会执行的,another 不会执行。当然你可以说 another 可以挪到最外面的 catch 后面,但是这样会导致整个程序不能非平凡地使用方法,因为最外面的 catch ,在一段“正常书写”的代码里,不一定在当前方法里面。
首先,Windows 不可能要求 txt 文件一定按某种格式存储,或许你的 txt 文件里面只有三个字节。所谓 Windows 的换行是 \r\n 是指通常的 Windows 软件会这样存储换行,但如 VSCode 等代码工具可以配置换行方式。

其次,这是 C 语言的抽象,任何平台的行分隔序列、行结尾序列,在文本模式下都会在通过 FILE 进入 C 语言时被变换为 \n ,并且 \n 会在通过 FILE 进入平台时换成平台特定的序列。要获得文件的字节内容,应该用二进制操作,即 rb 、wb 。
282 天前
回复了 xbleey 创建的主题 问与答 假护照是怎么离境的
如果拿的是外国护照且该护照是真的,或者是真护照篡改而来且篡改前的护照没有被报失且篡改得很好,那么边检很可能无法意识到这一点。
喔另外 Win32 的文件 API 是支持 \ 和 / 作为通常的路径分隔符的,实际上自从 MS-DOS 2.0 和 Windows 1.0 开始就一直支持两种方向。

https://retrocomputing.stackexchange.com/a/28348
会影响到传统 exe ,但补全导致的通常不会。

考虑 a.exe /b 这里 a.exe 会优先解读 /b 为一个开关、选项。如果写 a.exe \b 则 \b 通常是指当前磁盘根目录下叫做 b 的文件。补全一般会得到带盘符的绝对路径,比如 a.exe C:/b 和 a.exe C:\b ,这两者都只能被解读为路径,所以没问题。

另外我不太懂楼主设置的代码是否只在补全路径的时候才调用——有的时候按 Tab 补全的是参数的范围,此时贸然把 \ 替换为 / 是错误的。此外,还有 UNC path ,我不记得 UNC path 把 \ 改成 / 是否有效。
294 天前
回复了 rabbbit 创建的主题 C++ C++ 如何在函数中获取作为参数的数组的长度?
@GeruzoniAnsasu #11 应该这样做可以改进可执行文件大小:

void foo(int *array, size_t length);

template <size_t length>
void foo(int (&array)[length])
{ foo(array, length); }

最终结果里面 foo 模板的实例应该都会内联从而完全消除。如果要支持实参传递则要实现为 functor……
>虽然他是一个网页,但是它所有代码都是在你的浏览器里运行的,所以他是单机的。

这个说法很怪,一般认为浏览存储在远程计算机上的静态网站也属于非单机活动。

亲自演示即可证明楼主需要表达的,比如新建一个文件并重命名为 a.htm ,在里面写个 aaa 或者用 script 包裹一段调用 alert 的代码,然后双击这个文件,那当然就会在浏览器里打开并且看到,此时很明显是非联机。也可以用 Word 另存为 HTML 之类的。
296 天前
回复了 mmddisa 创建的主题 Windows Windows txt, docx(doc), xlsx(xls) 文件不显示缩略图
最后,txt 文件在默认状态下没有 IExtractImage——这可以用 IQueryAssociations 发现,或者查看注册表 HKCR\.txt 以及 HKCR\txtfile 以及 HKCR\SystemFileAssociations\text 里面都没有 IExtractIcon, IExtractImage, IThumbnailProvider 的注册。OneDrive 会提供 .txt 的缩略图。
296 天前
回复了 mmddisa 创建的主题 Windows Windows txt, docx(doc), xlsx(xls) 文件不显示缩略图
多嘴一句,为什么云文档需要特供的缩略图等 shell 功能?因为云文件不一定已经下载到本地,而为了显示缩略图或者文件预览下载文件是大忌,所以云文档的缩略图由云存储提供商准备。

参考阅读 https://devblogs.microsoft.com/oldnewthing/20170503-00/?p=96105 另外提示链接里文章的 online 和 offline 的意思和当今常见的一种用法相反。
296 天前
回复了 mmddisa 创建的主题 Windows Windows txt, docx(doc), xlsx(xls) 文件不显示缩略图
OneDrive 有缩略图是因为是 cloud file provider API 提供的,见 https://learn.microsoft.com/en-us/windows/win32/cfapi/build-a-cloud-file-sync-engine

Word 文档必须保存缩略图才能被 IExtractImage 接口( Word 的实现是 CLSID = {355822FC-86F1-4BE8-B5F0-A33736789641})提取缩略图,开启这个功能有两种主要方法。

第一种:在 Word 里随便新建一个文档,点功能区 File 选项卡,再点左侧的 Info 选项卡,再点 Properties 下来列表,点 Advanced Properties ,在 Summary 选项卡选中 Save Thumbnails for All Words Documents 复选框,点 OK 。

第二种:在 Word 里按 F12 ,在 Save As 对话框里选中 Save Thumbnail 复选框,然后保存。
>异步方法中根本没办法使用锁, 顶多用用信号量 Semaphore 来代替锁.
>貌似也没法仅对非异步代码进行加锁, 因为同步异步代码是混杂在一块的, 没法单独对非异步代码进行加锁.

规则是 lock 里面不可以有 await (可以实现,但是几乎总是错误的,因此语言层面拒绝这样做),在 async 方法中 lock 是完全 OK 的。

ConcurrentDictionary 已经确保每次访问它的成员都是原子的,然而这不代表对它的访问逻辑就已经线程安全,比如一段代码里连续访问它的成员两次,那么在中途其他线程可能已经修改过了这个字典。说这点是预防针,楼主在 #14 提到这是为了确保 Device 存在 devices 里面的引用安全。

要保证每个 Device 实例线程安全,最简单的思路是细粒度,比如操作每个 device 的时候 lock 之。如果操作过程需要异步,那么我想象中楼主说有多个线程查看 devices 并做一些事,意思是如果 A 线程处理了 device1 则 B 线程应该跳过并处理 device2 ,这种情况下因为 device 被占用时无需等待,所以可以用 interlocked operation 实现:

1. 在 device 上加上一个 int 字段 InUse ,表示目前是否在处理它,初始化为 0 。
2. 要访问一个 device ,先用 Interlocked.Exchange 查看 InUse 并设置为 1 ,如果 InUse 之前也是 1 ,则跳过。
3. 否则 InUse 之前是 0 并且被原子设置为 1 ,此时当前方法认为自己接管该 device 并开始异步硬件 API 操作,在 await 结束、处理完 device 后,重新 Exchange 把 InUse 还原为 0 。
输入给系统还是那个(安装)程序其实区别不大,因为最终效果包括(安装)程序以高权限运行。通常来说一旦一个程序以高权限运行一次,它就可以固化这一权力,比如把自己变成高权限自启动服务,甚至修改系统。因此纠结这个问题在主流的桌面系统安全模型下意义不大,必须首先信任(安装)程序才可以(向系统)输入密码。

主要的担忧应该是:如何识别输入密码对话框是某个特定程序(自己或者通过系统)发起的?假设有一个恶意程序反复检查是否有安装程序将要提权,发现时率先显示假的凭据窗口,则输入密码会导致安全问题。

在受限用户下输入密码提权是很难确保安全的,即使考虑 Windows 的“要求输入凭据之前按 Ctrl+Alt+Delete”,也需要配合公钥体系才能较好解决这个问题。恶意程序可以率先发起提权请求,于是用户按了 CAD 之后再输入密码,虽然密码不能被恶意程序读取,但还是会被恶意程序截获权限。公钥体系可以确保提权对话框提示目标程序的签名,因而避免一切未经根证书间接信任的恶意程序。

标准操作是使用快速用户切换,完全切换到已经是高权限的环境下去运行受信任的(安装)程序。登录之前,可以先按 CAD 确保是系统的登录对话框而不是别的程序假冒的。
@drymonfidelia #5
@zanjie1999 #6

不算,因为开源包括任意使用的自由,对比案例是 JSON 初版要求“不得用于邪恶之事”,以及 996 ICU 协议要求“压榨工人的资本家不能使用”,以及 Meta 的 Llama 有奇怪的商业使用限制,都属于非开源且非自由。开源包括在除了对自由的保护的限制外无限制使用代码的自由,所以禁止受权人在另一软件里使用 50% 代码也属于非开源且非自由。

软件名字是商标的问题,不是版权(软件许可)的问题,所以要求改名是 OK 的。

“开源软件”“自由软件”是 OSI 和 FSF 定义的,除了 FSF 几乎没人会谴责非自由软件,没有必要非沾上这俩词。同时,我觉得使用这两个词的时候也应该力求准确。结论就是:可以自己写一个协议作出那些要求,不应该称之为开源,其他人会根据他们对协议的接受程度选择使用或者不使用、如何使用这些软件。
301 天前
回复了 dtla 创建的主题 程序员 一道 Java 八股,检测 AI 智商
How do you deal with the error?
How do you deal with error?
How do you deal with the Error?
How do you deal with Error?

四句话意思不同:1 的意思是“如何处理那个错误”; 2 是“如何处理错误”,但 2 听起来不悦耳,应该用复数 errors 或者加不定冠词 an ; 3 的意思是“如何处理那个特定的 Error (对象或者某个子类)”; 4 的意思是“如何处理 Error (一般地,该类和子类和对象)”。在 Error 上可以用复数,3 的意思会变成特定的几个 Error/它的子类/对象,4 的意思无变化。

4 对应楼主希望提问的八股问题,不需要冠词是因为 Error 是所指的名字(等同于 John Doe 不需要加冠词)。1 、3 单独作为一句话出现的时候是无意义的,因为没有上下文表明是哪个错误/Error 。

在口语里面无法区分 Error 和 error ,所以需要额外说明,例如 the Error class 或者 programming errors 。即使是在 Java 的语境里,在没有其他的上下文时,发音 error 指 Error (类)还是(一般意义的)错误依然是不明确的。
赞,不过没有许可协议的仓库包含的代码不是开源的,请参考 https://choosealicense.com/ 并给你的仓库选择一个合适的协议(如果你希望它是开源的话)
1 ... 4  5  6  7  8  9  10  11  12  13 ... 177  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3038 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 13:53 · PVG 21:53 · LAX 05:53 · JFK 08:53
Developed with CodeLauncher
♥ Do have faith in what you're doing.