【发布时间】:2012-03-30 06:42:48
【问题描述】:
我正在尝试在不使用迭代器的情况下实现我自己的矢量类版本。这是问题可能需要的部分。
template <typename T>
class Vector {
public:
...
~Vector()
{
delete [] m_data;
}
...
void erase(size_t position)
{
if (position >= m_size) {
throw std::out_of_range("erasing an element out of bounds");
}
--m_size;
for (size_t i = position; i < m_size; ++i) {
m_data[i] = m_data[i + 1];
}
m_data[m_size].T::~T();
}
...
private:
T* m_data;
size_t m_size;
...
};
以下是cplusplus.com 对erase 函数std::vector 的引用:
这通过删除元素的数量有效地减少了向量的大小,在之前调用每个元素的析构函数。
所以我尝试通过调用最后一个重复元素的析构函数来实现相同的功能。 m_data[position] 的析构函数是不必要的,因为它将被下一个元素替换。
问题是向量类delete [] m_data的析构函数中的代码也会为每个元素调用析构函数,这会导致内存的双重删除和崩溃。
谁能帮助为我的矢量类编写正确的擦除函数?
【问题讨论】:
-
你根本不应该使用array-new。相反,像
std::vector一样,分配原始内存并就地构造对象。 -
@KerrekSB 我尝试实现用于处理堆内存的简单版本以及使用它的函数的正确实现。该类是为学习目的而编写的,应该使用带有 new/delete 的内存分配/释放。我正在使用保留内存,每次达到最大值时都会翻倍。
-
那又怎样?关键是array-new 构造对象,如果你想自己控制对象构造,那很可能不是你想要的。
-
@KerrekSB 你是对的。我只是第一次阅读时没有得到你的想法。因此,我还提出了分配和使用原始内存并在使用
new/delete的地方构造对象的解决方案。谢谢。
标签: c++