C++ 内存分配和重写 vector 类

标签 c++ class inheritance memory-management segmentation-fault

我正在用 C++ 进行赋值,我们必须重写从抽象 Container 类继承的 std::vector 类。我们必须为“Vector”编写方法,例如 begin()、end()、push_back() 等... 许多基本的 std::vector 成员函数可以在这里找到:http://www.cplusplus.com/reference/vector/vector/


我的问题是多方面的,主要是因为我是初学者,电脑的内存力很神奇。另外,如果这个问题非常具体或在这里有类似的答案,我很抱歉,但我真的被卡住了,因为这是我第一次处理内存。


这是我的 Container 和 Vector 类实现:

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; }
};

第 2 部分。

我什么时候/为什么需要析构函数?我试图阅读 Stack 上的析构函数,但我感到困惑多于澄清。我假设 SegFault 来自需要释放的内存,而且我知道我应该学习如何通过此分配动态分配内存。构造函数和析构函数对于这个过程至关重要,但有人可以为我尽可能简单地分解它吗?


编辑:

我已通过实现 Fureeish 的回答修复了段错误。我的代码已在上面更新。

唯一剩下的查询是析构函数及其目的。我是否需要为 Vector 实现一个,或者它会被 Container 自动调用?

最佳答案

您决定自己管理内存,但您从未分配过任何内存。您到处都缺少一些新的。例如,给定一个:

Vector(int n, T fill_val) {
    sz = n;
    cap = 2*n;
    for(int i = 0; i < sz; i++) {
        elem[i] = fill_val; 
    }
}

for() 循环遍历 elem,这是一个未初始化的指针。您将其视为指向动态分配数组的指针,但它只是指向一些垃圾值。请记住 - 首先分配,然后处理(仅当您决定自己管理内存时。通常您应该更喜欢使用标准实现)。

正确的版本应该是这样的:

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; 
    }
}

事实上你在使用其他构造函数时从未遇到过这个问题只是你非常幸运和未定义的行为偷偷摸摸

关于C++ 内存分配和重写 vector 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51391387/

相关文章:

c++ - 根据另一个 Mat 的非零像素选择 cv::Mat 的一部分?

javascript - 如何在 JavaScript 的构造函数中重写继承对象的属性?

java - 继承和静态嵌套 Java 类

c++ - 通过线程的 Qt 5.1 QML 属性

c++ - UDP 客户端/服务器发送数据但无法读取

c++ - 使用 `memmove` 删除 std::string 的第一个字符

c++ - 错误 : Redefinition of Class (C++)

java - 在没有第三方库的情况下从Python启动JVM?

Python 在类定义之外覆盖 __str__

java - 在Java中,当一个接口(interface) "extends"另一个接口(interface)时到底会发生什么?