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 connullptr
- 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 que0
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*)
)