#c
#c
Вопрос:
uint8_t hello = 50;
uint8_t *data;
data = new uint8_t(hello); //issue when using "new"
data = (uint8_t*)malloc(hello); //worked fine
Я хочу выделить память, как в вышеупомянутом коде. Если я удалю эти данные ptr в конце области видимости, произойдет какая-то утечка памяти. Кроме того, правильно ли я выделил память? Требуется ли какое-либо приведение, как я сделал для malloc?
Комментарии:
1. В C вы должны ориентироваться на использование
new
, избегаяmalloc
, за исключением совместимости с существующим кодом C.
Ответ №1:
Если вы хотите создать буфер определенного размера:
uint8_t *data = new uint8_t[hello];
Где hello
ваш аргумент размера. Обратите внимание на использование [...]
вместо (...)
. Вторая форма предназначена для аргументов конструктора при создании одного из чего-либо.
Исходная форма создает выделение для одного uint8_t
и заполняет это конкретное значение значением 50
. Предположительно, это не то, что вы хотите, но это работает:
data = new uint8_t(hello);
std::cout << *data << std::endl;
Это выводит 2
правильный, поскольку это символ ASCII 50.
Все это, как говорится, для символьных буферов ориентируйтесь на
std::string
и далеко, далеко от буферов в стиле C, если сможете.
Комментарии:
1. uint8_t *данные = новый uint8_t[привет]; — Это сработало. Теперь, если я хочу удалить память, нужно ли мне перебирать каждый элемент? Что, если я хочу удалить память за пределами области?
2. В C вы соединяетесь
new[]
сdelete[]
, так что в конечном итоге вы бы позвонилиdelete[] data
, чтобы освободить это распределение. Вы можете работать только с распределением, возвращенным вам vianew[]
, а не с какими-либо его изменениями, напримерamp;data[n]
. Точный указатель, который вам дается, — это тот, который вы освобождаете. Вы можете передать его, но вы должны отправить его обратноdelete[]
как есть.3. Обратите внимание, что это управление памятью выполняется для вас автоматически, с
std::vector<uint8_t>
помощью которого можно предварительно определить размер и предварительно заполнить все, что вы хотите.4.Задать этот вопрос — это нормально, но это признак того, что вам нужно узнать о принципе RIAA, который является основой управления памятью C . Короче говоря, если вы вызываете
new[]
, вы должны в конечном итоге позвонитьdelete[]
. Если вы вызываетеnew
, вы вызываетеdelete
. Если вы используетеstd::vector
withoutnew
, вы не вызываете,delete
если элементы в этом векторе не были выделены с помощью,new
и вы не используете какую-то оболочку указателя, которой вы можете передать выделение.5. @galaxy2096 Почти никогда нет веской причины использовать new и vector . Используйте один из другого (предпочтительно использовать vector), но не оба. Это альтернативы.