new[]
está específicamente definido para tener un valor de puntero a pesar de la conversión implícita de matriz a puntero que se activaría de todos modos.
Pero no creo que estés de suerte. Después de todo, su ejemplo no está administrando un puntero a un int
, está administrando un puntero a un int[10]
. Así que la forma ideal es
MyAutoPtr<int[10]> ptr2(new int[10]);
Como se menciona la nariz roja del unicornio, new int[10]
no crea una matriz C-estilo. Lo hará si su compilador también cumple con el estándar C, pero C++ permite que las matrices de estilo C sean más que las matrices de estilo C en C. De todos modos, new
que va a crear una matriz de estilo C si preguntas como esta:
MyAutoPtr<int[10]> ptr2(new int [1] [10]);
Desafortunadamente, delete contents;
no funcionará incluso con int (*contents)[10];
.El compilador puede hacer lo correcto: el estándar no especifica que la matriz se convierta en un puntero como con new
, y creo que recuerdo que GCC sustituyó delete[]
y emitió una advertencia. Pero es un comportamiento indefinido.
Por lo tanto, necesitará dos destructores, uno para llamar al delete
y otro para llamar al delete[]
. Puesto que no puede especializarse en parte una función, la funcionalidad exige un ayudante parcialmente especializados
template< class T > struct smartptr_dtor {
void operator()(T *ptr) { delete ptr; }
};
template< class T, size_t N > struct smartptr_dtor<T[N]> {
void operator()(T (*ptr) [N]) { delete [] ptr; }
};
template< class T >
void proper_delete(T *p) {
smartptr_dtor<T>()(p);
}
que por alguna razón yo sólo me sometí a; v)
Desafortunadamente, esto no funciona con dinámica- arreglos de tamaño, así que voy a escribir otra respuesta.
Buena pregunta de todos modos: eso realmente hace que desees un manejo adecuado de 'array' dentro del lenguaje mismo :( –
No debes usar un parámetro booleano para distinguir los tipos. Como la decisión se toma en tiempo de compilación, deberías ejecútelo en el tipo, lo que significa que crea una clase de puntero inteligente para punteros normales y uno para matrices. –