es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se garantiza que el puntero desde la conversión a base sea un puntero a la región de memoria del objeto derivado?

Dado este código:

#include <cassert>
#include <cstring>

struct base{
    virtual ~base() = default;
};

class derived: public base{
public:
    int x;
};

using byte = unsigned char;

int main() {
    byte data[sizeof(derived)];
    derived d;
    memcpy(data, &d, sizeof(derived));
    base* p = static_cast<base*>(reinterpret_cast<derived*>(data));
    const auto offset = (long)data - (long)p;
    assert(offset < sizeof(derived)); // ¿Está definido esto?
}

Como mi comentario pregunta, ¿es este comportamiento definido por el estándar? Es decir, ¿garantiza la conversión a base un puntero a la región ocupada por el objeto derived que está siendo convertido? A partir de mis pruebas, funciona en gcc y clang, pero me pregunto si también funciona en diferentes plataformas (obviamente, esta versión asume punteros de 64 bits).</derived></base>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El comportamiento del código proporcionado es indefinido según el estándar C++. El estándar no garantiza que la conversión de punteros de una clase base a una clase derivada garantice un puntero a la región ocupada por la clase derivada a la que se le está haciendo casting.

    Aunque el código puede funcionar en algunos compiladores o plataformas, no es portátil y puede resultar en comportamientos inesperados o fallos. Es importante asegurarse de que el código siga las reglas y pautas establecidas por el estándar para garantizar la portabilidad y evitar posibles problemas.

Comments are closed.