Tengo un código donde uso un puntero para acceder a un bloque de datos. En algunos casos excepcionales, algunos miembros del bloque de datos están vacíos y, como resultado, el puntero se queda colgando. De hecho, obtengo el puntero correcto pero el programa falla al intentar hacer algo con el puntero.¿Hay alguna manera de verificar si el puntero está colgando?
El consejo habitual sería evitar este tipo de uso. Pero lamentablemente, el marco que uso requiere que use este tipo de métodos de acceso a datos.
¿Hay alguna forma de que pueda "verificar" si el puntero no es válido antes de realizar cualquier operación con él? Comprobar que el puntero no es igual a NULL no funcionó, obviamente. También probé esto:
try
{
CString csClassName = typeid(*pMyPointer).name(); // Check error condition
// The line below fails due to dangling pointer (data block is not valid).
hr = pMyPointer->MyPointerMethod();
}
catch(bad_typeid)
{
return E_FAIL;
}
catch(...)
{
return E_FAIL;
}
¿Es la manera correcta?
Mi puntero debe ser estático para la clase ... ¿está bien si utilizo punteros inteligentes? – Nikhil
Eso no es problema en absoluto. Debe tener cuidado con los problemas de seguridad del hilo, pero eso no es diferente para un puntero inteligente frente a un puntero sin formato. –
No creo que importe. Lo único que me molesta es si su marco puede hacer que sus punteros cuelguen sin previo aviso. Mira, tendrás que extraer el puntero sin formato del puntero inteligente y pasarlo a tu marco. Si garantiza que el puntero seguirá siendo válido después de la llamada, o que se le informará en caso de que se vuelva inválido, bien, vaya por ello. – Septagram