数组的 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中文网其他相关文章!