首页 >后端开发 >C++ >阵列的新放置可以便携式使用吗?

阵列的新放置可以便携式使用吗?

Patricia Arquette
Patricia Arquette原创
2024-11-12 13:43:01232浏览

 Can Placement New for Arrays Be Used Portably?

数组的 Placement New:可移植使用指南

虽然placement new 为数组分配提供了强大的工具,但确保其可移植性可以一个挑战。正如提供的示例中所观察到的,Visual Studio 可以分配与传递给 new[] 的地址不同的缓冲区,这可能会导致内存损坏。

了解开销

在数组上使用 new 放置所涉及的开销取决于编译器。在 Visual Studio 中,编译器向缓冲区添加一个四字节计数以跟踪数组中的元素数量。此计数对于删除数组时调用对象析构函数至关重要。

可移植替代方案

要解决可移植性问题,请考虑以下替代方案:

为每个元素单独分配新位置:

不要对整个数组使用新位置,而是单独分配每个元素:

char *pBuffer = new char[NUMELEMENTS * sizeof(A)];
A *pA = (A*)pBuffer;

for (int i = 0; i < NUMELEMENTS; ++i) {
    pA[i] = new (pA + i) A();
}

这种方法无需额外的开销并确保可移植性。

手动对象销毁:

无论采用哪种分配方法,请确保在删除缓冲区之前手动销毁数组中的每个对象:

for (int i = 0; i < NUMELEMENTS; ++i) {
    pA[i].~A();
}

此步骤可以防止内存泄漏并确保正确的对象清理。

内存跟踪开销

需要注意的是编译器对于内存的开销跟踪情况各不相同。例如,在 Visual Studio 中,从类中删除虚拟析构函数就不再需要四字节计数。了解特定编译器的内存跟踪要求可以帮助您优化性能。

以上是阵列的新放置可以便携式使用吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn