¿El valor make_unique inicializa la matriz de caracteres?

2 minutos de lectura

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?

  • ¿Hay alguna razón por la que estás usando std::unique_ptr<char[]> en lugar de std::vector<char>?

    – TartánLlama

    9 de febrero de 2017 a las 15:10

  • No necesitarías el std::memset para inicializar todo a 0 porque std::make_unique<char[]>(bufSize) utilizará la expresión new 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 con buffer.release().

    – Khouri Giordano

    16 de marzo de 2019 a las 16:35

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.

avatar de usuario de songyuanyao
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 charserá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í.

¿Ha sido útil esta solución?