编写我自己的push_back功能

Writing my own push_back funtion

本文关键字:back 功能 push 自己的 我自己      更新时间:2023-10-16

我有一个简单的 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;时,它会产生一些内存泄漏。当我使用时,程序立即崩溃。

未启动的原始指针可能包含随机内存地址。

因此,如果您在第一个 pushBack 中调用delete[] elem;,那么您尝试删除一个随机内存地址:

删除表达式:

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

要解决此问题,您需要在构造器中启动std::string* elem

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

似乎您在删除"elem"后访问了它。 在函数结束时执行删除操作

您是否使用"新建"创建要删除的内容?

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