Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;内存分配和重写向量类 我在C++中做了一个任务,我们必须重写从抽象容器类继承的STD::vector类。我们必须为“Vector”编写方法,如begin()、end()、push_back()等。。。 这里有许多基本的std::vector成员函数:_C++_Class_Inheritance_Memory Management_Segmentation Fault - Fatal编程技术网

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。很好,我很高兴你终于看到了曙光。你可以用这些元素做任何你喜欢的事情,我相信你的导师会很高兴告诉你的。如果有的话。哦,你为什么要删除你的评论?@pickypoo1987
elem=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; 
    }
}