对于许多编码测试,STL 是不允许的,所以我正在尝试实现向量类。为了表示该图,我使用邻接表。它在
new_allocation
方法中给了我分段错误。有时,当我运行代码时,我会得到正确的输出,但当我调试时,我会得到 SegFault。
以下是我的代码。
#include <iostream>
using namespace std;
template <typename T> class vector{
T *arr;
int s;
int c;
void new_allocation(){
T *temp = new T[s + 10]; // SEGMENTATION FAULT HERE
c = s + 10;
for (int i = 0; i < s; i++)
temp[i] = arr[i];
arr = temp;
delete[] temp;
}
public:
vector() { s = c = 0; }
vector(int userVectorSize){
s = c = userVectorSize;
arr = new T[userVectorSize];
}
void push_back(T data){
if (s == c)
new_allocation();
arr[s] = data;
s++;
}
T operator[](int index){ return arr[index]; }
int size() { return s; }
};
int main(){
int n, m;
cin >> n >> m;
vector<int> graph[n + 1];
for (int i = 0; i < m; i++){
int v1, v2;
cin >> v1 >> v2;
graph[v1].push_back(v2);
graph[v2].push_back(v1);
}
for (int i = 1; i <= n; i++){
cout << i << " -> ";
for (int k = 0; k < graph[i].size(); k++)
cout << graph[i][k] << " ";
cout << endl;
}
}
这永远行不通
arr = temp;
delete[] temp;
将“temp”指针放入 arr(数据元素的工作缓冲区)中,然后将其删除,因此 arr 指向已删除的内存
arr
: vector() {
s = c = 0;
arr = nullptr; // (1)
}
delete[]
。 void new_allocation() {
T *temp = new T[s + 10]; // SEGMENTATION FAULT HERE
c = s + 10;
for (int i = 0; i < s; i++)
temp[i] = arr[i];
// (2)
if (arr != nullptr) {
delete[] arr;
}
arr = temp;
}
原因是你的
arr
默认指向任意内存,所以当你尝试delete[] arr
时它仍然会报告分段错误。
#include <iostream>
using namespace std;
template <typename T> class vector {
T *arr;
int s;
int c;
void new_allocation() {
T *temp = new T[s + 10]; // SEGMENTATION FAULT HERE
c = s + 10;
for (int i = 0; i < s; i++)
temp[i] = arr[i];
if (arr != nullptr) {
delete[] arr;
}
arr = temp;
}
public:
vector() {
s = c = 0;
arr = nullptr;
}
vector(int userVectorSize) {
s = c = userVectorSize;
arr = new T[userVectorSize];
}
void push_back(T data) {
if (s == c)
new_allocation();
arr[s] = data;
s++;
}
T operator[](int index) { return arr[index]; }
int size() { return s; }
};
int main() {
int n, m;
cin >> n >> m;
vector<int> graph[n + 1];
for (int i = 0; i < m; i++) {
int v1, v2;
cin >> v1 >> v2;
graph[v1].push_back(v2);
graph[v2].push_back(v1);
}
for (int i = 1; i <= n; i++) {
cout << i << " -> ";
for (int k = 0; k < graph[i].size(); k++)
cout << graph[i][k] << " ";
cout << endl;
}
}
你应该删除 arr 而不是 temp:
void new_allocation(){
T *temp = new T[s + 10]; // SEGMENTATION FAULT HERE
c = s + 10;
for (int i = 0; i < s; i++)
temp[i] = arr[i];
delete[] arr;
arr = temp;
}