如何将涉及自定义矢量类的内存重新分配操作描述为一个超长尾?

2026-04-16 19:014阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计434个文字,预计阅读时间需要2分钟。

如何将涉及自定义矢量类的内存重新分配操作描述为一个超长尾?

我想实现一个简单的向量类。即使用保留的内存尽可能多,同时支持向量的长度增加。因此,我需要分配一个新的内存块,复制元素,然后释放旧的内存块。如果使用新的T类型数组[T]创建一个新向量,则需要创建一个内部向量。

我想实现我自己的简单矢量类.即使保留的内存耗尽,此向量也应支持推送新元素(类型为T).所以,我需要分配一个新的内存块,复制元素,然后释放旧的内存块.

如果我使用新的T []创建一个内存块,那么我必须使用delete []释放它,这将使向量中的每个元素的构造函数被调用.我不希望这样,因为我想到只使用memcpy()复制旧的向量.

所以我想出了使用new char []分配内存并使用placement new来填充数组的决定.当我需要重新分配保留的内存时,我只在内存块上使用memcpy(),然后使用delete []释放它.

这是合理的解决方案吗?

如何将涉及自定义矢量类的内存重新分配操作描述为一个超长尾?

只有某些对象应该(通过,允许)通过memcpy“复制”.这些被称为 trivial types – 它不能有自定义析构函数.

因此,使用memcpy来避免调用析构函数是矛盾的.如果不需要后者,你只能被允许做前者.

考虑一下:通常,T可能有指向它自己成员的指针/引用(或同一向量中的其他T).如果使用memcpy移动这些对象,这些将继续引用旧的(现在无效的)内存位置.这正是T的构造函数和析构函数必须处理的(如果甚至允许复制/移动它们),那么省略它们将导致问题.

本文共计434个文字,预计阅读时间需要2分钟。

如何将涉及自定义矢量类的内存重新分配操作描述为一个超长尾?

我想实现一个简单的向量类。即使用保留的内存尽可能多,同时支持向量的长度增加。因此,我需要分配一个新的内存块,复制元素,然后释放旧的内存块。如果使用新的T类型数组[T]创建一个新向量,则需要创建一个内部向量。

我想实现我自己的简单矢量类.即使保留的内存耗尽,此向量也应支持推送新元素(类型为T).所以,我需要分配一个新的内存块,复制元素,然后释放旧的内存块.

如果我使用新的T []创建一个内存块,那么我必须使用delete []释放它,这将使向量中的每个元素的构造函数被调用.我不希望这样,因为我想到只使用memcpy()复制旧的向量.

所以我想出了使用new char []分配内存并使用placement new来填充数组的决定.当我需要重新分配保留的内存时,我只在内存块上使用memcpy(),然后使用delete []释放它.

这是合理的解决方案吗?

如何将涉及自定义矢量类的内存重新分配操作描述为一个超长尾?

只有某些对象应该(通过,允许)通过memcpy“复制”.这些被称为 trivial types – 它不能有自定义析构函数.

因此,使用memcpy来避免调用析构函数是矛盾的.如果不需要后者,你只能被允许做前者.

考虑一下:通常,T可能有指向它自己成员的指针/引用(或同一向量中的其他T).如果使用memcpy移动这些对象,这些将继续引用旧的(现在无效的)内存位置.这正是T的构造函数和析构函数必须处理的(如果甚至允许复制/移动它们),那么省略它们将导致问题.