自定义字符串实现,运算符+过载内存分配问题

时间:2016-02-26 17:51:17

标签: c++ operator-overloading

我正在尝试用c ++创建自定义字符串实现,我遇到了重载operator" +"的问题。我想将新字符串附加到现有字符串,当我尝试分配新的扩展字符串时,调试器分配大约12个字节,然后它应该。我无法控制分配,他只是忽略了变量" length"。这是代码:

    class String 
{
private:
    char *ptrNiz;
public:

String(const char *niz = "")
    {
        ptrNiz = new char[strlen(niz)+1];

        strcpy_s(ptrNiz, strlen(niz)+1, niz);

        cout << "stvoren niz: " << ptrNiz << endl;
    }
    String(const String& refString)
    {
        ptrNiz = new char[strlen(refString.ptrNiz) + 1];
        strcpy_s(ptrNiz, strlen(refString.ptrNiz) + 1, refString.ptrNiz);
        cout << "Kopiran niz: " << ptrNiz << endl;
    }
    ~String()
    {
        cout << "Unisten objekt: " << ptrNiz << endl;
        delete[] ptrNiz;
    }

    int Length() const 
    {
        return strlen(ptrNiz);
    }
    int CharAt(int i) const
    {
        return ptrNiz[i];
    }
    void Ispisi()
    {
        cout << ptrNiz << endl;
    }

    operator char*()
    {
        return ptrNiz;
    }

    String operator+=(const const String& ref)
    { 
        const int const length = ref.Length() + this->Length() + 1;

        char *temp = new char[length]; // ignores length and allocates more space

        for (int i = 0; i < this->Length(); i++)
        {
            temp[i] = ptrNiz[i];
        }
        for (int j = 0; j < ref.Length(); j++)
        {
            temp[this->Length() + j] = ref.ptrNiz[j];
        }

        return String(temp);
    }

};

3 个答案:

答案 0 :(得分:2)

char *temp = new char[length]; // ignores length and allocates more space

这里要做的所有C ++实现都返回一个指向内存位置的指针,其中length字节的空间。没有更多,没有更少。允许在内部分配更多字节,即使您的代码不能尝试访问它们(否则行为未定义)。

动态内存分配的低级细节是一个实现问题,而不是代码的关注。

对于C ++实现可能使用额外字节来调试信息的情况,调试版本是一个非常好的示例。事实上,这可能就是这里发生的事情。我想你使用的是Visual C ++。正如its documentation (CRT Debug Heap Details)所说:

  

当您请求内存块时,调试堆管理器会从中分配   基本堆稍大一点的内存块比请求和   返回指向该块部分的指针。

     

[...]

     

调试堆例程分配的附加内存用于   簿记信息,用于链接调试存储器块的指针   一起,以及数据两侧的小缓冲区来捕获   覆盖已分配的区域。

请注意,您的代码中存在其他严重错误。我现在决定忽略它们,只是回答了你提出的确切问题。

答案 1 :(得分:0)

您正在分配两次,一次在构造函数中,另一次在operator + =方法中。您也没有删除操作员功能中的指针,以便内存泄漏。使用智能指针或提供额外的构造函数参数,该参数指定传入指针的所有权。

答案 2 :(得分:-2)

在您的代码中,请添加以下行以使用NULL;

终止字符串
String operator+=(const const String& ref)
{
   // You code goes here
    temp[length - 1] = '\0';
    return String(temp);
}

这将按预期工作。

希望这有帮助。