试图实现一个非常简单的玩具版本的 std::vector 并击中一个我不明白的EXC_BAD_ACCESS



我刚开始学习C++,当我遇到我在标题中提到的错误时,我正在尝试实现一个简单的 std::vector 版本。下面的代码有时会触发一行EXC_BAD_ACCESS,我在下面的代码片段上用注释标记了该行,我不确定为什么。有人有什么建议吗?我以为new只是记忆力差,很难理解这怎么会失败。谢谢!

#include <iostream>
template<class T, int init_size = 1>
struct Vector
{
T* store = new T[1];
size_t length = init_size;
size_t size = init_size;
void append(T value)
{
length++;
if (length > size)
{
printf("Reallocated storen");
size_t new_size = size * 2;
T* newStore = new T[size];  // Sometimes gives me a EXC_BAD_ACCESS
memcpy(newStore, store, size * sizeof(size_t));
delete[] store;
store = newStore;
size = new_size;
}
store[length - 1] = value;

}
};
int main(int argc, const char * argv[]) {
Vector<int> vector;
for(int i=0; i<20; ++i) {
for (int j=0; j<vector.length; ++j)
{
std::cout << vector.store[j] << "-";
}
printf("n");
vector.append(i);
}

}

编辑:由于PaulMcKenzie的回复,最终修复了它。不过,不确定为什么异常会在T* newStore = new T[size]而不是store[length - 1] = value;弹出,这是我实际访问未分配内存的地方。有什么想法吗?

您的代码存在几个问题。

首先是这个:

size_t new_size = size * 2;
T* newStore = new T[size];  // <------ Error

使用new[]时,无法使用new_size。 代码应为:

size_t new_size = size * 2;
T* newStore = new T[new_size];  

第二个问题是你应该使用std::copy来复制元素,而不是memcpymemcpy将无法处理不可复制的对象,例如std::string

#include <algorithm>
//...
std::copy(store, store + size, newStore);

最后一项是您的类没有用户定义的复制构造函数、析构函数和赋值运算符,因此Vector具有不正确的复制语义。

我假设最后一项只是因为您没有完成课程而存在。 但我建议您在添加更多功能之前完成这些复制功能。

相关内容

最新更新