我有一个简单的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;
时,它会造成一些内存泄漏。当我使用时,程序立即崩溃。
答案 0 :(得分:3)
未初始化的原始指针可能包含随机存储器地址。
所以,如果你先打电话给delete[] elem;
,请先尝试删除随机存储地址:
对于
delete []
形式,expression必须是空指针值或先前由new-expression的数组形式获得的指针值。如果表达式是其他任何东西,包括它是否是由new-expression的非数组形式获得的指针,则行为是未定义的。
要解决这个问题,您需要在您的construtor中初始化std::string* elem
:
Vector(): siz(0), elm(nullptr) {}
答案 1 :(得分:-3)
您似乎可以访问&#34; elem&#34;删除后。 在函数结尾处执行删除
您是否使用&#34; new&#34;?
创建了要删除的内容另外:作为优化,考虑在更大的块中增加矢量的大小,以确保在每次推回时重新分配的工作量