cpp-como-usar-nullptr

Qué es y cómo usar nullpt en C++

En C++11 y versiones posteriores, nullptr es un literal especial que representa un puntero nulo (es decir, un puntero que no apunta a una dirección válida)

Antes de C++11, teníamos que utilizar NULL o 0. Pero esto daba errores de ambigüedad, especialmente al trabajar con funciones sobrecargadas y templates.

Además mejora la legibilidad y ayuda a prevenir errores difíciles de detectar relacionados con la gestión de memoria

Se recomienda utilizar nullptr siempre que sea posible en lugar de NULL o 0 para representar punteros nulos

Declaración de punteros nulos

Para declarar un puntero nulo en C++11 y versiones posteriores, simplemente lo inicializamos a nullptr. Esto asegura que el puntero no tenga una dirección válida asignada.

#include <iostream>

int main() {
    int* ptr = nullptr; // Puntero a int inicializado a nullptr

    if (ptr == nullptr) {
        std::cout << "El puntero no apunta a ninguna dirección válida." << std::endl;
    }

    return 0;
}

Aquí,

  • El puntero ptr se declara y se inicializa con nullptr
  • Esto significa que no tiene ninguna dirección de memoria válida asignada.

Ventajas de nullptr

La principal ventaja de nullptr radica en su capacidad para mejorar la seguridad y la claridad del código. Por ejemplo imaginemos este supuesto,

#include <iostream>

void func(int x) {
    std::cout << "func(int) llamada con " << x << std::endl;
}

void func(int* ptr) {
    if (ptr) {
        std::cout << "func(int*) llamada con puntero válido." << std::endl;
    } else {
        std::cout << "func(int*) llamada con puntero nulo." << std::endl;
    }
}

int main() {
    func(0);       // Ambiguo con NULL, se interpreta como `func(int)`
    func(nullptr); // Claro: llama a `func(int*)` con puntero nulo

    return 0;
}

En este ejemplo,

  • func(0) puede ser ambiguo, ya que 0 podría interpretarse como un entero en lugar de un puntero.
  • Con nullptr, no hay ambigüedad: func(nullptr) llama a la sobrecarga que acepta un puntero (func(int*))