【问题标题】:Writing my own push_back funtion编写我自己的 push_back 函数
【发布时间】:2026-02-21 14:25:02
【问题描述】:

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

【问题讨论】:

  • 您没有在构造函数中将 elem 初始化为 nullptr
  • @KillzoneKid temp[i] = elem[i] 不会在第一次 pushBack 中执行,因为那时 siz 将是 0
  • @t.niese 对!

标签: c++ stdvector push-back


【解决方案1】:

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

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

delete expression:

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

要解决这个问题,您需要在构造函数中初始化 std::string* elem

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

【讨论】:

  • 感谢您的提示!我确实将 elem 初始化为 NULL,但仍然出现内存泄漏。我的泄漏测试器指向 std::string* temp = new std::sting[siz+1] 行。它说 new[] 没有正确的 delete[]
  • Vector的析构函数中是否删除elem?但请记住遵循三(或五)规则并定义复制构造函数等
【解决方案2】:

似乎您在删除“elem”后访问它。 在函数末尾执行删除

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

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

【讨论】:

  • 问题不在于elem被删除后才被访问,而是对于第一个pushBackdelete[] elem;会在随机内存地址上被调用,因为elem没有被初始化为例如nullptr.