如何将涉及自定义矢量类的内存重新分配操作描述为一个超长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计434个文字,预计阅读时间需要2分钟。
我想实现一个简单的向量类。即使用保留的内存尽可能多,同时支持向量的长度增加。因此,我需要分配一个新的内存块,复制元素,然后释放旧的内存块。如果使用新的T类型数组[T]创建一个新向量,则需要创建一个内部向量。
我想实现我自己的简单矢量类.即使保留的内存耗尽,此向量也应支持推送新元素(类型为T).所以,我需要分配一个新的内存块,复制元素,然后释放旧的内存块.如果我使用新的T []创建一个内存块,那么我必须使用delete []释放它,这将使向量中的每个元素的构造函数被调用.我不希望这样,因为我想到只使用memcpy()复制旧的向量.
所以我想出了使用new char []分配内存并使用placement new来填充数组的决定.当我需要重新分配保留的内存时,我只在内存块上使用memcpy(),然后使用delete []释放它.
这是合理的解决方案吗?
因此,使用memcpy来避免调用析构函数是矛盾的.如果不需要后者,你只能被允许做前者.
考虑一下:通常,T可能有指向它自己成员的指针/引用(或同一向量中的其他T).如果使用memcpy移动这些对象,这些将继续引用旧的(现在无效的)内存位置.这正是T的构造函数和析构函数必须处理的(如果甚至允许复制/移动它们),那么省略它们将导致问题.
本文共计434个文字,预计阅读时间需要2分钟。
我想实现一个简单的向量类。即使用保留的内存尽可能多,同时支持向量的长度增加。因此,我需要分配一个新的内存块,复制元素,然后释放旧的内存块。如果使用新的T类型数组[T]创建一个新向量,则需要创建一个内部向量。
我想实现我自己的简单矢量类.即使保留的内存耗尽,此向量也应支持推送新元素(类型为T).所以,我需要分配一个新的内存块,复制元素,然后释放旧的内存块.如果我使用新的T []创建一个内存块,那么我必须使用delete []释放它,这将使向量中的每个元素的构造函数被调用.我不希望这样,因为我想到只使用memcpy()复制旧的向量.
所以我想出了使用new char []分配内存并使用placement new来填充数组的决定.当我需要重新分配保留的内存时,我只在内存块上使用memcpy(),然后使用delete []释放它.
这是合理的解决方案吗?
因此,使用memcpy来避免调用析构函数是矛盾的.如果不需要后者,你只能被允许做前者.
考虑一下:通常,T可能有指向它自己成员的指针/引用(或同一向量中的其他T).如果使用memcpy移动这些对象,这些将继续引用旧的(现在无效的)内存位置.这正是T的构造函数和析构函数必须处理的(如果甚至允许复制/移动它们),那么省略它们将导致问题.

