динамическое выделение памяти с использованием оператора new , проблема в приведении типов

#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 , чтобы освободить это распределение. Вы можете работать только с распределением, возвращенным вам via new[] , а не с какими-либо его изменениями, например amp;data[n] . Точный указатель, который вам дается, — это тот, который вы освобождаете. Вы можете передать его, но вы должны отправить его обратно delete[] как есть.

3. Обратите внимание, что это управление памятью выполняется для вас автоматически, с std::vector<uint8_t> помощью которого можно предварительно определить размер и предварительно заполнить все, что вы хотите.

4.Задать этот вопрос — это нормально, но это признак того, что вам нужно узнать о принципе RIAA, который является основой управления памятью C . Короче говоря, если вы вызываете new[] , вы должны в конечном итоге позвонить delete[] . Если вы вызываете new , вы вызываете delete . Если вы используете std::vector without new , вы не вызываете, delete если элементы в этом векторе не были выделены с помощью, new и вы не используете какую-то оболочку указателя, которой вы можете передать выделение.

5. @galaxy2096 Почти никогда нет веской причины использовать new и vector . Используйте один из другого (предпочтительно использовать vector), но не оба. Это альтернативы.