gpt4 book ai didi

c++ - C++中未初始化的内存

转载 作者:行者123 更新时间:2023-12-05 08:56:23 25 4
gpt4 key购买 nike

C++ 中的

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

在 C 中,我可以使用 malloc 来分配内存,而不是初始化它。

最佳答案

将分配与构造分开是可能的,但有点棘手。 (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

说到 STL...您可以为::std::容器指定您自己的分配器。例如,如果您使用 std::vector 分配 float 数组,它将毫无理由地将它们初始化为零。 (有一个针对 vector 的专门化。)您可以自己滚动:std::vector

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

--> Is it possible? std::vector<double> my_vec(sz); which is allocated but not initialized or filled

看看它是如何使用 placement new 的。

::new(static_cast<void*>(ptr)) U;
// Calls class U constructor on ptr.

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

还有一个大写字母……避免过早优化。您因不对对象进行两次初始化而节省的计算机周期真的值得付出努力吗?

关于c++ - C++中未初始化的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41254130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com