удалить функцию в C ++ - PullRequest
       27

удалить функцию в C ++

6 голосов
/ 07 августа 2010

Я видел пример использования функции: delete в cpp, но я не до конца ее понял.код:

class Name {
    const char* s;
    //...
};

class Table {
      Name* p;
      size_t sz;
public:
      Table(size_t s = 15){p = new Name[sz = s]; }
      ~Table { delete[] p; }
};

Каково точное действие команды: delete[] p;?

Я думаю, что цель состояла в том, чтобы удалить все указатели в таблице Table.

Скобки в delete[] дают мне подсказку, что он удаляет массив указателей на Name, но размер массива не указан, так как деструктор "узнает", сколько указателей нужно удалить?

Ответы [ 2 ]

13 голосов
/ 07 августа 2010

delete не функция, это оператор.

Выражение delete с использованием [] уничтожает объекты, созданные с помощью new ... [], и освобождает связанную память.delete[] должен использоваться для указателей, возвращаемых new ... [];не массив delete только для указателей, возвращаемых не массивом new.Использование несоответствующей формы delete всегда неверно.

Выражение delete в ~Table() (в вашем коде отсутствует ()) уничтожит динамически создаваемый массив объектов Name, гарантируя, чтодеструктор Name вызывается для каждого члена массива.

Реализация заключается в реализации некоторого механизма записи количества элементов в массивах, выделенных с помощью new ... [], которые программист не долженбеспокоиться об этом.

Во многих реализациях, где элементы массива имеют нетривиальные деструкторы, выражение new[] будет выделять дополнительное пространство для записи количества элементов перед пространством для всех членов массива.Затем этот скрытый счетчик ищется, когда delete[] используется для обеспечения правильного количества вызываемых деструкторов.Это просто деталь реализации, хотя возможны и другие реализации.

1 голос
/ 07 августа 2010

Короче говоря, delete[] знает размер удаляемого массива, потому что это необходимо.

Поскольку стандарт языка C ++ утверждает, что он должен знать.Поэтому, когда вы выделяете массив, система должна сохранить размер где-нибудь, где delete[] сможет его найти.

Один из вариантов - выделить на несколько байтов больше, чем нужно.Используйте первые байты, чтобы указать размер, а затем вместо того, чтобы возвращать указатель на первый выделенный байт, возвращайте указатель на первый байт после поля размера.

Тогда delete[] просто нужно вычесть несколькобайтов от указателя для определения размера.

Другой вариант может иметь глобальный map<void*, int>, где ключ - это указатель на выделение памяти, а значение - это размер этого выделения.Есть множество других способов узнать размер delete[].Стандарт C ++ не определяет, какой использовать.Это просто говорит о том, что delete[] должен знать размер, и оставляет разработчикам возможность выяснить , как справиться с этим.

...