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

时间:2018-08-18 17:16:13

标签: c++

我在执行以下操作的代码中遇到段错误:

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

在浪费大量时间试图找出代码中的问题(甚至valgrind崩溃)之后,我发现我正在使用的库(在其自己的翻译单元中)正在访问和编辑以下元素:向量超出范围。

这些问题是否得到缓解?还是只能祈祷我们正在使用的库不会泄漏? 为什么允许不同的翻译单元共享存储空间?

1 个答案:

答案 0 :(得分:1)

  

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

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

  

还是我们只能祈祷我们正在使用的库不会泄漏?

嗯,泄漏是一个问题。超出范围访问内存通常是一个更为严重的问题。

除了祈祷以外,您还可以做更多的事情。您可以为该库编写(单元,集成等)测试,并使用试图检测未定义行为的工具执行那些测试。或者,您可以尝试通过手动分析源来验证库的正确性。

如果您不能事先测试一段代码(例如,在第三方插件的情况下),则存在(大多数?)操作系统提供的有用的内存隔离工具:进程。一个进程不能直接访问另一个进程的内存,因此,如果您在子进程中运行第三方代码,则它不能破坏父进程的内存,并且如果子进程尝试访问错误的内存,则被操作系统杀死,则不必终止父进程。

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