Если у меня есть:Что удалить после назначения?
template<>
char *toBytes<uint64_t>(uint64_t src) {
char *data = new char[8];
//...stuff
return data;
}
template<>
void write<uint64_t>(char *dst, uint64_t src) {
char *srcBytes = toBytes(src);
for (int i = 0; i < 8; ++i) {
*(dst++) = *(srcBytes++); //am I leaking here?
}
}
, который получает называется что-то вроде:
char *keyPtr = new char[27];
//...stuff
write(keyPtr, 1234ull);
//...write up to 27
Если бы delete[] keyPtr;
бы я удалил srcBytes? Я думаю, что вопрос заключается в том, что на линии, спрашивающей, не просачивается ли я, это то, что делает копию, и в результате удаление keyPtr
оставляет srcBytes
еще не удаленным?
Все еще изучая C++, и это не всегда понятно для меня, когда конструктор копирования называется vs оператором присваивания.
EDIT 1:
Исправлено удаление в соответствии с @ ответ Steephen в
EDIT 2
Добавить toBytes согласно @ WhozCraig замечании
Нет, удаление 'keyPtr' не имеет никакого отношения к управлению памятью, переданной' srcBytes'. И так как мы не можем видеть, как возникла эта память (источник для 'toBytes' не включен в ваш вопрос), мы не можем сказать, требуется ли удаление' srcBytes' или нет. Если он динамически распределен, ему необходимо удалить, но обратите внимание, что вы потеряете начальный адрес выделения с помощью этой конструкции цикла, которая постоянно увеличивает значение srcBytes', поэтому вам нужно будет сохранить указатель на него, чтобы удалить [] ' или использовать другой механик цикла. – WhozCraig
С вашим добавлением вам обязательно нужно удалить этот возвращенный буфер из 'toBytes()'. Проблема в том, что единственный указатель, который ссылается на него, изменяется сразу после его назначения. То есть вы теряете указатель, который вам нужно удалить [] '. Может, подумать об этом. – WhozCraig
В качестве побочного примечания, поскольку вы все больше узнаете о языках C++ и других языках, одна проблема дизайна начинает входить в игру с точки зрения управления жизненным циклом и передачи владения динамической памятью в целом. Используются различные методологии, включая пулы памяти (обычно используемые w/Objective C) или общие указатели (найдены в таких вещах, как библиотека ускорения). Это помогает передать понятию пользователям API, что эта память управляется, хотя и с некоторыми издержками производительности (например, счетчиками ссылок и т. Д.), – Gary