新的[size_t] + 1会返回什么

时间:2011-12-09 10:42:32

标签: c++ pointers return new-operator

下面的代码示例,如果来自“C ++ von A bis Z”(第二版,翻译:C ++从A到Z),请参阅第364页。样本错误。

// overload operator +=
#include <iostream>
#include <cstring>
using namespace std;

class String {
private:
    char* buffer;
    unsigned int len;

public:
    String(const char* s="") {
        // cout << "Constructor: " << s << "\n";
        len = strlen(s);
        buffer = new char [len+1];
        strcpy(buffer, s);
    }
    ~String() {
        // cout << "Destructor: " << buffer << "\n";
        delete [] buffer;
    }
    String(const String& s) {
        // cout << "Copy_Constructor: " << s.get_buffer() << "\n";
        len = s.len;
        buffer = new char [len+1];
        strcpy(buffer, s.buffer);
    }
    char* get_buffer() const {
        return buffer;
    }

    // returning a reference is more efficent
    // String& operater+=(const String& str1)
    String operator+=(const String& str1) {
        // cout << "Assignment_Operator +=: " << str1.get_buffer() << "\n";
        String tmp(*this);
        delete [] buffer;
        len = tmp.len + str1.len;
        // invalid pointer
        // buffer = new char[len+1];
        buffer = new char [len]+1;
        strcpy(buffer, tmp.buffer);
        strcat(buffer, str1.buffer);
        // wrong return_type
        // return *this;
        return buffer;
    }
};

int main(void) {
    String string1("Adam");
    String string2("Eva");
    string1+=" und ";
    string1.operator+=(string2);
    cout << string1.get_buffer() << "\n";
    return 0;
}

带有评论的行是我的“修正”。现在我想知道“新char [len] +1”的作用是什么?我想以下几点:

  • 它从堆
  • 分配sizeof(char)* len内存
  • 并将WRONG地址返回到指针* buffer
  • 但错误的地址是什么:“堆上的新内存的第一个地址+ 1”或“堆上的新内存的第一个地址+ sizeof(char)* 1”?

会发生什么? 感谢

//编辑 谢谢你们!你帮了我! 我只是想知道,这句话将会回归。

new char [len]+1;

该行本身当然是本书作者的错字。

6 个答案:

答案 0 :(得分:4)

让我们分解一下:

new char[len];

返回指向char数组的指针。

new char[len] + 1;

返回内存中的下一个地址。

它基本上切断了第一个角色。

编辑:正如其他人所提到的,这很可能是一个错字,它应该是new char[len+1]。我只是解释代码的作用,但如果你真的知道你在做什么,你应该只使用指针算术。 cHao指出,试图删除返回的指针将是UB。如果len == 1,您还将获得UB并尝试使用返回的指针。

答案 1 :(得分:1)

如果向i添加整数T*,则会向指针添加sizeof(T) * i。因此,在这种情况下,由于new char[len]返回char*+ 1确实会向其添加sizeof(char) * 1

答案 2 :(得分:0)

new Type[size] + 1将分配一个大小为size的数组,并生成索引为1的元素的地址 - 即第二个元素。没什么特别的,只是指针算法。 new[]将生成索引为0的元素的地址,并且在该地址上执行大小+1,它将生成索引为1的元素的地址。

答案 3 :(得分:0)

它只返回指向 second 数组项=)的指针 阅读C指针;)

答案 4 :(得分:0)

+sizeof(char)*1,但我没听清你为什么要这样做。

答案 5 :(得分:0)

我认为这是一个错字,它应该是new char [len+1]+1用于必须存在的字符串终止符。