为什么不同的翻译单元没有独立和沙盒的内存空间?

Why different translation units do not have independent & sandboxed memory spaces?

本文关键字:内存 空间 翻译 单元 为什么不 独立      更新时间:2023-10-16

我被代码中的段错误击中,我只是在做以下事情:

std::vector<int> A;
A.push_back(2);

在浪费了太多时间试图弄清楚我的代码中的问题是什么(甚至 valgrind 崩溃了(之后,我发现我正在使用的一个库(在其自己的翻译单元中(正在访问和编辑向量的元素超出其界限。

这些问题是否有任何缓解措施?或者我们只能祈祷我们使用的图书馆不会泄漏? 为什么允许不同的翻译单元共享内存空间?

为什么不同的翻译单元没有独立和沙盒的内存空间?

因为能够从一个 TU 访问另一个 TU 的数据结构非常有用。

或者我们只能祈祷我们使用的图书馆不会泄漏?

好吧,泄漏是一个问题。越界访问内存通常是一个更严重的问题。

你可以做的不仅仅是祈祷。您可以为库编写(单元、集成等(测试,并使用尝试检测未定义行为的工具执行这些测试。或者,您可以尝试通过手动分析源来验证库的正确性。

如果您无法事先测试一段代码,例如在第三方插件的情况下,则(大多数?(操作系统提供了一个有用的内存隔离工具:进程。一个进程不能直接访问另一个进程的内存,所以如果你在子进程中运行第三方代码,那么它就不会破坏父进程的内存,如果子进程尝试错误的内存访问,并作系统杀死,则不需要杀死父进程。

然而,不幸的是,C++标准库没有用于进程的API。