c++;内存分配和重写向量类 我在C++中做了一个任务,我们必须重写从抽象容器类继承的STD::vector类。我们必须为“Vector”编写方法,如begin()、end()、push_back()等。。。 这里有许多基本的std::vector成员函数:
我的问题是多方面的,主要是因为我是一个初学者,计算机的内存很吸引人。另外,如果这个问题非常具体或者在这里有类似的答案,我也很抱歉,但我真的被卡住了,因为这是我第一次处理记忆问题c++;内存分配和重写向量类 我在C++中做了一个任务,我们必须重写从抽象容器类继承的STD::vector类。我们必须为“Vector”编写方法,如begin()、end()、push_back()等。。。 这里有许多基本的std::vector成员函数:,c++,class,inheritance,memory-management,segmentation-fault,C++,Class,Inheritance,Memory Management,Segmentation Fault,我的问题是多方面的,主要是因为我是一个初学者,计算机的内存很吸引人。另外,如果这个问题非常具体或者在这里有类似的答案,我也很抱歉,但我真的被卡住了,因为这是我第一次处理记忆问题 以下是我的容器和向量类实现: template <typename T> class Container { protected: T* elem; int cap; public: virtual T& operator[](int
以下是我的容器和向量类实现:
template <typename T>
class Container {
protected:
T* elem;
int cap;
public:
virtual T& operator[](int i) = 0;
virtual int size() = 0;
~ Container() { delete[] elem; }
};
template <typename T>
class Vector: public Container<T> {
protected:
using Container<T>::elem;
using Container<T>::cap;
private:
int sz;
public:
// constructors
Vector(); // default constructor
Vector(int n); // fill constructor #1
Vector(int n, T fill_val); // fill constructor #2
/* // ~ Vector(); // destructors
unsure if the above is correct, because of the Container destructor
*/
// overloaded operators
T& operator[](int i); // subscript overloading '[]'
T& operator=(const Vector<T>& V); // assignment overloading '='
// access methods
T& front(); //returns a reference to the first element
T& back(); //returns a reference to the last element
// iterator methods
T* begin(); // returns memory address of the first element
T* end(); // returns memory address at the end
// size methods
int size() { return sz; }
int capacity() { return cap; }
};
模板
类容器{
受保护的:
T*elem;
int cap;
公众:
虚拟T&运算符[](int i)=0;
虚拟整数大小()=0;
~Container(){delete[]elem;}
};
样板
类向量:公共容器{
受保护的:
使用Container::elem;
使用容器::盖;
私人:
int sz;
公众:
//建设者
Vector();//默认构造函数
向量(int n);//填充构造函数#1
向量(int n,T fill_val);//填充构造函数#2
/*//~Vector();//析构函数
由于容器析构函数,不确定上述内容是否正确
*/
//重载运算符
T运算符[](int i);//下标重载“[]”
T&运算符=(常量向量&V);//赋值重载'='
//访问方法
T&front();//返回对第一个元素的引用
T&back();//返回对最后一个元素的引用
//迭代器方法
T*begin();//返回第一个元素的内存地址
T*end();//返回末尾的内存地址
//尺寸方法
int size(){return sz;}
int capacity(){return cap;}
};
第二部分 我什么时候/为什么需要析构函数?我试着阅读堆栈上的析构函数,但我感到困惑多于澄清。我假设SegFault来自需要释放的内存,我知道我应该学习如何通过这个分配动态分配内存。构造函数和析构函数对于这个过程至关重要,但是有人能为我尽可能简单地分解它吗
编辑: 我已经通过实现Fureeish的答案修复了分段错误。我的代码已在上面更新
剩下的唯一查询是析构函数及其用途。我是否需要为
Vector
实现一个,或者它将由容器自动调用?您决定自己管理内存,但从未分配任何内存。您到处都缺少一些新的。例如,给定一个:
Vector(int n, T fill_val) {
sz = n;
cap = 2*n;
for(int i = 0; i < sz; i++) {
elem[i] = fill_val;
}
}
在使用其他构造函数时,您从未遇到过这个问题,这是因为您非常幸运,而且未定义的行为非常狡猾请尝试编写一个非模板版本,例如int
的向量,而不使用继承,我觉得有点奇怪,Container
delete
s没有分配或使用它的指针数组。应该从基类中删除指针数组。我可以想象,容器的定义是根据任务给出的,但是不能更改。是的,我们应该在容器中实现析构函数,但我也不确定它何时/如何删除向量中的指针数组。我相信你会学到的。就我个人而言,我称之为厄运。我宁愿知道我的UB在哪一天藏起来week@alterigel说得对。幸运的是,我的意思是代码似乎可以工作,但显然,从开发人员的角度来看,这是一个非常不幸的事件是的!你的代码行在两个点修复了它!(你说得对,我很幸运,我在另一个构造函数中需要它)最后一件事,elem=new T[cap]
初始化一个类型为T的指针数组,然后我可以对它们进行迭代以设置它们填充值?伙计,这个作业真的让我很感激使用std::vectors lol。很好,我很高兴你终于看到了曙光。你可以用这些元素做任何你喜欢的事情,我相信你的导师会很高兴告诉你的。如果有的话。哦,你为什么要删除你的评论?@pickypoo1987elem=new T[cap]
不会初始化T
类型的指针数组。它动态分配cap
的T
s的数量。它们只是对象,不是指向它们的指针
Vector(int n, T fill_val) {
sz = n;
cap = 2*n;
elem = new T[cap]; // or cap-1, depending on what you do with `end()`.
for(int i = 0; i < sz; i++) {
elem[i] = fill_val;
}
}