![]() |
1
32
就我个人而言,我会选择不在数组上使用placement new,而是在数组中的每个项目上单独使用placement new。例如:
无论使用哪种方法,在删除pBuffer之前,请确保手动销毁数组中的每个项目,因为最终可能会出现泄漏;) 笔记 :我还没有编译这个,但我认为它应该可以工作(我在一台没有安装C++编译器的机器上)。它仍然表明了这一点:)希望它在某种程度上有所帮助! 编辑: 它需要跟踪元素数量的原因是,当你对数组调用delete时,它可以迭代它们,并确保对每个对象调用析构函数。如果它不知道有多少人,它就无法做到这一点。 |
![]() |
2
5
@德里克 5.3.4,第12节讨论了数组分配开销,除非我误读了它,否则它似乎暗示编译器在放置new时也可以添加它:
也就是说,我认为VC是唯一给我带来麻烦的编译器,其中包括GCC、Codewarrior和ProDG。不过,我必须再次检查才能确定。 |
![]() |
3
4
@詹姆斯
经过深思熟虑,我同意你的观点。没有理由认为placement new需要存储元素的数量,因为没有placement delete。由于没有place-delete,因此没有理由使用place-new来存储元素的数量。 我还在Mac上用gcc测试了这个,使用了一个带有析构函数的类。在我的系统中,新的位置是 不 更改指针。这让我怀疑这是否是一个VC++问题,以及这是否可能违反标准(据我所知,标准没有具体解决这个问题)。 |
![]() |
4
3
谢谢你的回复。当我遇到这个问题时,我最终使用的解决方案是为数组中的每个项目使用新位置(对不起,应该在问题中提到这一点)。我只是觉得,用placement new来做这件事,我一定错过了什么。事实上,由于标准允许编译器向数组添加额外的未指定开销,placement new[]似乎基本上是不可用的。我不明白你怎么能安全便携地使用它。 我甚至不太清楚为什么它需要额外的数据,因为无论如何你都不会在数组上调用delete[],所以我不完全明白为什么它需要知道其中有多少项。 |
![]() |
5
3
Place-new本身是可移植的,但你对它在指定内存块上的作用所做的假设是不可移植的。就像之前说的那样,如果你是一个编译器,并且有一块内存,如果你只有一个指针,你怎么知道如何分配一个数组并正确销毁每个元素?(见操作员删除界面[]。) 编辑: 实际上有一个placement delete,只有当构造函数在分配带有placement new[]的数组时抛出异常时才会调用它。 new[]是否真的需要以某种方式跟踪元素的数量取决于标准,这取决于编译器。不幸的是,在这种情况下。 |
![]() |
6
2
与使用单个元素计算新放置的大小类似,使用这些元素的数组来计算数组所需的大小。 如果你需要其他计算的大小,其中元素的数量可能未知,你可以使用sizeof(A[1])并乘以你所需的元素计数。 例如
|
![]() |
7
1
C++17(草案N4659)在[expr.new]第15段中说:
因此,它似乎无法使用
在C++20(草案N4861)中,这被改为
因此,如果你确定你使用的是C++20,你可以安全地使用它,但只能使用那一种布局形式,而且只有在你不覆盖标准定义的情况下(它才会出现)。
即使是C++20文本似乎也很荒谬,因为额外空间的唯一目的是存储数组大小的元数据,但在使用任何自定义放置形式时都无法访问它
事实上,据我所知,没有安全的方法来使用自定义表单
我不明白他们(或者只是Stroustrup?)是怎么把这件事搞砸的。显然正确的方法是将数组元素的数量和每个元素的大小传递给
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 6 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 7 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 7 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 7 月前 |