我正在C++中编写自定义向量类。我有一个关于以下代码的问题:
vector<T> vec;
vec.push_back(one);
vec.push_back(two);
vec.push_back(vec[0]);
push_back的定义如下:
void push_back(const T & v)
为避免不必要的复制。它的实现看起来像是:
if (size == capacity)
{
allocate new storage
copy old values into new storage
// 2
delete old storage
fix pointers and counters
}
// 1
copy v at the end of storage
如果我们想要推送已经存在于向量中且向量需要扩展(大小等于其容量)的元素,问题就会出现。如果我们这样做(
vec.push_back(vec[0])
),那么在// 1
处它已经被释放了。因此,我们需要有一个副本。另一种选择是在扩展期间添加它,例如在// 2
处,但这看起来不太美观。你会如何解决这个问题?
//2
处处理它 - 有什么不好的呢?一个代码路径用于“正常”情况,另一个用于异常。 - Erikmalloc
和free
管理内存,并且对象被限制为POD类型时,才能使用realloc
。 - Mike Seymour