编写我自己的push_back函数

时间:2018-05-12 13:00:10

标签: c++ stdvector push-back

我有一个简单的c ++电话簿项目,我不允许使用std :: vector。 所以我决定为自己创造一个。 我想问一下我的push_back函数。

所以这是在vector.h中:

class Vector{
    int siz;            //size
    std::string* elem;  //elements
    public:
    Vector(): siz(0){}

    int getSize()const;
    void pushBack(std::string const&);

    std::string operator[](int) const;
    Vector& operator=(const Vector&);
};

这是我的push_back函数:

void Vector::pushBack(std::string const& s){
std::string* temp = new std::string[siz + 1];
for(int i = 0; i < siz; i++)
    temp[i] = elem[i];
temp[siz] = s;

//    delete[] elem;              // The debugger points here
this->elem = temp;
this->siz += 1;
}

这是我使用push_back函数的地方:

const Vector read(){
    Vector v;
    std::ifstream file;
    file.open("data.txt", std::ios::in);
    int db = 10 * linecounter();
    std::string temp;
    for(int i = 0; i < db; i++)
    {
        if(i % 10 == 9 && i != 0){
            getline(file, temp);          // the last data in the line after that ther is a \n
            v.pushBack(temp);
        }
        else{
            getline(file, temp, ';');     // read in the temp till the ;
            v.pushBack(temp);             // The debugger points here
        }
    }
    return v;
}

我的问题是,当我不使用delete[] elem;时,它会造成一些内存泄漏。当我使用时,程序立即崩溃。

2 个答案:

答案 0 :(得分:3)

未初始化的原始指针可能包含随机存储器地址。

所以,如果你先打电话给delete[] elem;,请先尝试删除随机存储地址:

delete expression

  

对于delete []形式,expression必须是空指针值或先前由new-expression的数组形式获得的指针值。如果表达式是其他任何东西,包括它是否是由new-expression的非数组形式获得的指针,则行为是未定义的。

要解决这个问题,您需要在您的construtor中初始化std::string* elem

Vector(): siz(0), elm(nullptr) {}

答案 1 :(得分:-3)

您似乎可以访问&#34; elem&#34;删除后。 在函数结尾处执行删除

您是否使用&#34; new&#34;?

创建了要删除的内容

另外:作为优化,考虑在更大的块中增加矢量的大小,以确保在每次推回时重新分配的工作量