C++中未初始化的内存

umb*_*sar 0 c++ memory memory-management memory-alignment

operator new在 C++ 中,分配和初始化内存(通过调用默认构造函数)。如果我想要内存未初始化怎么办?在这种情况下如何分配内存?

malloc例如,在 CI 中可以使用它只会分配内存,而不是初始化它。

Jiv*_*son 6

这是可能的,但将分配与构造分开有点棘手。(Bjarne Stroustrup 和我详细讨论了这个问题,大约 1985 年。)你需要做的是使用 ::operator new 来获取原始内存。稍后,如果对象类型需要,您可以使用placement-new 或其他方法进行初始化。这就是 STL 容器的默认分配器如何将分配和构造分开。

这为 U 类型的对象获取原始内存:

U *ptr = (U*) ::operator new (sizeof(U));
  // allocates memory by calling: operator new (sizeof(U))
  // but does not call U's constructor
Run Code Online (Sandbox Code Playgroud)

说到 STL...你可以为 ::std:: 容器指定你自己的分配器。例如,如果您使用 std::vector<float> 分配浮点数组,它会无端地将它们初始化为零。(vector<float> 有专门化。)您可以改为推出自己的:std::vector<float, my_own_allocator>。

以下链接中的自定义分配器继承了默认分配器的功能,几乎可以完成所有操作 - 包括原始内存的分配。它覆盖了construct() 的默认行为——以便什么都不做——当实际的构造函数是微不足道的并且不能抛出异常时。

-->有可能吗?std::vector<double> my_vec(sz); 已分配但未初始化或填充

了解它如何使用新版位。

::new(static_cast<void*>(ptr)) U;
 // Calls class U constructor on ptr.
Run Code Online (Sandbox Code Playgroud)

您的分配器甚至可以这样编写,以便在为调试而编译时,它会用非法数字(NaN)填充数组,并在为释放而编译时使内存未初始化。我见过的一些最严重的错误是在默认零起作用时出现的 - 直到它们不起作用。不信任默认值。

另一个大写字母的事情......避免早期优化。您因不两次初始化对象而节省的计算机周期是否真的值得付出努力?