我的 ArrayList 类重新分配中的分段错误
Segmentation Fault in my ArrayList class reallocation
出于学习目的,我正在尝试创建一个原始ArrayList
类,该类能够在需要时添加元素并调整自身大小。目前,我设法创建了一个构造函数并重载数组访问运算符,并添加一个append
函数以将元素添加到数组的后面。但是,一旦触发realloc
,程序就会崩溃并显示Segmentation Fault: 11
.不过,奇怪的是,如果我更改代码,第一次执行它时没有分段错误;只有当重新运行可执行文件时,它才会失败,所以我怀疑我的free()
调用无法正常工作。在重新分配之前的所有元素似乎都已成功添加。
我在.cpp文件中定义了我的类,因为模板定义无法拆分为头文件和其他文件。
结构.cpp
#include <cstdlib>
#include <stdexcept>
template<typename T> class ArrayList {
private:
T* pointer;
unsigned short space;
public:
ArrayList();
~ArrayList();
T& operator[](unsigned short index);
const T& operator[](unsigned short index) const;
unsigned short length;
void append(T element);
};
template<typename T> ArrayList<T>::ArrayList() {
length = 0;
space = 10;
pointer = (T*)malloc(space*sizeof(T));
}
template<typename T> ArrayList<T>::~ArrayList() {
free(pointer);
}
template<typename T> T& ArrayList<T>::operator[](unsigned short index) {
if (index > length) throw std::out_of_range("Index out of bounds.");
return *(pointer + sizeof(T)*index);
}
template<typename T> void ArrayList<T>::append(T element) {
if (length == space) {
space *= 2;
pointer = (T*)realloc(pointer, sizeof(T)*space);
}
*(pointer + sizeof(T)*length) = element;
++length;
}
主.cpp
#include <iostream>
#include "structures.cpp"
int main(int argc, char** argv) {
ArrayList<unsigned> arr;
int l = 11;
for (int i = 0; i < l; ++i) {
std::cout << "Current index: " << i << std::endl;
arr.append(i);
}
std::cout << "Finished writing to array" << std::endl;
for (int i = 0; i < l; ++i) {
std::cout << "Index: " << i << " Value: " << arr[i] << std::endl;
}
return 0;
}
输出:
Current index: 0
Current index: 1
Current index: 2
Current index: 3
Current index: 4
Current index: 5
Current index: 6
Current index: 7
Current index: 8
Current index: 9
Current index: 10
Segmentation fault: 11
问题就在这里(在你的append
函数中(:
*(pointer + sizeof(T)*length) = element;
您忘记了pointer
是指向T
元素数组(的第一个元素(的指针,而不是字节数组。你正在做的事情(完全(等于
pointer[sizeof(T)*length] = element;
这显然是错误的,很容易超出界限并导致未定义的行为。
正确的方法很简单
pointer[length] = element;
或者,如果您被迫使用显式指针算法(我认为没有其他原因(
*(pointer + length) = element;
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?