Tengo esta jerarquía de clases trivial:En C++, ¿por qué se necesita `nuevo` para crear dinámicamente un objeto en lugar de asignación?
class Base {
public:
virtual int x() const = 0;
};
class Derived : public Base {
int _x;
public:
Derived(int x) : _x(x) { }
int x() const { return _x; }
};
Si uso malloc
asignar una instancia de Derived
, y luego tratar de acceder a la función polimórfica x
, errores en el programa (me da un fallo de segmentación):
int main() {
Derived *d;
d = (Derived*) malloc(sizeof(Derived));
*d = Derived(123);
std::cout << d->x() << std::endl; // crash
return 0;
}
Por supuesto, mi aplicación real es mucho más compleja (es una especie de grupo de memoria).
estoy bastante seguro de que es debido a la forma asigno d
: Yo no utilizar new
.
sé de placement new
operador, que debe ser lo que necesito, pero nunca he utilizado y han conseguido algunas preguntas:
¿Por qué mi estrellarse aplicación, si yo no uso
new
?¿Qué hace realmente
new
?¿Por qué no puedo simplemente usar el operador de asignación para asignar el valor de
Derived(123);
al área de memoria apuntada pord
?¿Tendría que usar
new
también para tipos no polimórficos?¿Qué hay de los POD?
En el C++Faq I linked above dice que la región de memoria pasada a la ubicación
new
debe estar alineada para el objeto que estoy creando.Sé lo que es la alineación, pero no sé cómo verificar la alineación necesaria para mi clase.
malloc
manual dice:El malloc() y calloc() devuelven un puntero a la memoria asignada que está convenientemente preparada para cualquier tipo de variable.
y espero que la alineación sea necesario para mi clase es el tamaño de la clase que devuelve
sizeof
, por lo que cualquier dirección en formaaddress_returned_by_malloc + i * sizeof(my_class)
es adecuado para asignar mis objetos.¿Tengo esperanzas?
¿Por qué no acaba de anular el nuevo operador para esta clase? – Earlz
"¿Por qué' malloc' no funciona para las clases? " y "¿Por qué necesitamos' nuevo'? " son preguntas muy diferentes, una de las cuales tiene una respuesta. –
@Earlz, estoy a punto de ** cargar ** nuevo operador, pero quería saber por qué tenía que usar 'new'. @Chris Lutz: sí y no; esta pregunta fue: "¿Por qué necesito usar' new' en lugar de 'malloc' para crear instancias de objetos de clase?" – peoro