Por ejemplo –
#include <memory>
int main(){
const auto bufSize = 1024;
auto buffer = std::make_unique<char[]>(bufSize);
}
¿El búfer aquí ya está lleno de '\0'
caracteres o tendré que llenarlo manualmente para evitar valores basura.
¿Y cuál sería la forma posible de hacer esto? std::memset(&buffer.get(), 0, bufSize)
¿satisfacer?
Toda la make_*
Las funciones usan la inicialización de valor para el tipo si no proporciona parámetros de constructor. Dado que la forma de matriz de make_unique
no toma ningún parámetro, pondrá a cero los elementos.
cancionyuanyao
Sí, todos los elementos serán valor inicializado por estándar::make_unique.
La función es equivalente a:
unique_ptr<T>(new typename std::remove_extent<T>::type[size]())
y
inicialización de valor
Esta es la inicialización realizada cuando se construye una variable con un inicializador vacío.
Sintaxis
new T (); (2)
y
Los efectos de la inicialización del valor son:
3) si
T
es un tipo de matriz, cada elemento de la matriz tiene un valor inicializado;
4) de lo contrario, el objeto se inicializa a cero.
entonces para cada elemento de tipo char
serán inicializados por valor (inicializados a cero) para '\0'
.
De acuerdo a preferencia cpSí:
2) Construye una matriz de límite desconocido T. Esta sobrecarga solo participa en la resolución de sobrecarga si T es una matriz de límite desconocido. La función es equivalente a:
unique_ptr<T>(new typename std::remove_extent<T>::type[size]()) value initialization ^
Inicialización del valor indicado por mí.
¿Hay alguna razón por la que estás usando
std::unique_ptr<char[]>
en lugar destd::vector<char>
?– TartánLlama
9 de febrero de 2017 a las 15:10
No necesitarías el
std::memset
para inicializar todo a0
porquestd::make_unique<char[]>(bufSize)
utilizará la expresiónnew char[bufSize]()
. Observe la inicialización predeterminada,()
– WhiZTiM
9 de febrero de 2017 a las 15:12
@TartanLlama sí.
– Abhinav Gauniyal
9 de febrero de 2017 a las 15:13
IIRC, si el dato es un miembro de la clase, un std::vector asignará algo de espacio y luego lo asignará nuevamente en el inevitable cambio de tamaño. (Otros han analizado las implementaciones y han llegado a esta conclusión). El puntero del búfer puede ser nulo hasta que se asigne. Como está escrito aquí, no hace ninguna diferencia, pero importa en otros casos.
– usuario1329482
06/11/2017 a las 20:31
Estoy aquí porque quiero asignar y administrar un búfer usando
unique_ptr
pero, en algún momento, entregárselo a una función de C como un puntero sin formato conbuffer.release()
.– Khouri Giordano
16 de marzo de 2019 a las 16:35