Что возвращает новый [size_t] + 1 - PullRequest
2 голосов
/ 09 декабря 2011

Следующий пример кода из книги «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;
}

Theстроки с комментариями - мои "исправления".Теперь я хочу знать, что делает "new char [len] +1"?Я думаю следующее:

  • он выделяет sizeof (char) * len памяти из кучи
  • и возвращает НЕПРАВИЛЬНЫЙ адрес в указатель * buffer
  • но чтонеправильный адрес: «первый адрес новой памяти в куче + 1» или «первый адрес новой памяти в куче + sizeof (char) * 1)?

Что происходит? Спасибо

// edit Спасибо всем! Вы мне помогли! Я просто хотел знать, что вернет это утверждение.

new char [len]+1;

Сама строка, конечно, опечатка от авторакнига.

Ответы [ 6 ]

4 голосов
/ 09 декабря 2011

Давайте разберемся:

new char[len];

возвращает указатель на массив char.

new char[len] + 1;

возвращает следующий адрес в памяти.

Это в основном отрезание первого персонажа.

РЕДАКТИРОВАТЬ: Как уже упоминали другие, это, скорее всего, опечатка, это должно быть new char[len+1]. Я просто объясняю, что делает код, но вы должны использовать арифметику указателей, только если вы действительно знаете, что делаете. Попытка удалить возвращенный указатель будет UB, как указал cHao. Вы также получите UB, если len == 1, и попытаетесь работать с возвращенным указателем.

1 голос
/ 09 декабря 2011

Если вы добавите целое число i к T*, это добавит sizeof(T) * i к указателю.Так что в этом случае, поскольку new char[len] возвращает char*, + 1 действительно добавит sizeof(char) * 1 к нему.

0 голосов
/ 09 декабря 2011

Я думаю, что это опечатка, и она должна быть new char [len+1].+1 - это символ конца строки, который должен существовать.

0 голосов
/ 09 декабря 2011

+sizeof(char)*1, но я не смог понять, почему ты это сделал.

0 голосов
/ 09 декабря 2011

Он просто возвращает указатель на второй элемент массива =) Читайте о C указателях;)

0 голосов
/ 09 декабря 2011

new Type[size] + 1 выделит массив размером size и выдаст адрес элемента с индексом 1 - это второй элемент.Ничего особенного, только указатель арифметики.new[] выдаст адрес элемента с индексом 0, а размер +1 будет выполнен по этому адресу, он получит адрес элемента с индексом 1.

...