c++ - studio - memset objective c
memset para inicialización en C++ (2)
Es una idea terrible. Solo está revisando los datos, sin prestar atención a cómo deben inicializarse los objetos. Si su clase es virtual, es probable que también elimine el puntero vtable.
memset
funciona con datos sin procesar, pero C ++ no se trata de datos sin procesar. C ++ crea abstracciones, por lo que si quiere estar seguro, use esas abstracciones. Usa la lista de inicializadores para inicializar miembros.
Puedes hacerlo a tipos de POD:
struct nothing_fancy_here
{
bool b;
int i;
void* p;
};
nothing_fancy_here x;
memset(&x, 0, sizeof(x));
Pero si lo está haciendo con this
, eso significa que está en un constructor definido por el usuario y ya no califica como un tipo de POD. (Aunque si todos sus miembros son POD, podría funcionar, siempre y cuando ninguno contenga 0 como valor de captura. No estoy seguro de si alguna otra fuente de comportamiento indefinido entra en juego aquí).
memset se usa a veces para inicializar datos en un constructor como el siguiente ejemplo. ¿Funciona en general? ¿Es una buena idea en general?
class A {
public:
A();
private:
int a;
float f;
char str[35];
long *lp;
};
A::A()
{
memset(this, 0, sizeof(*this));
}
No uses memset
. Es un remanente de C y no funcionará en no POD. Específicamente, su uso en una clase derivada que contiene cualquier función virtual, o cualquier clase que contenga una no incorporada, resultará en un desastre.
C ++ proporciona una sintaxis específica para la inicialización:
class A {
public:
A();
private:
int a;
float f;
char str[35];
long *lp;
};
A::A()
: a(0), f(0), str(), lp(NULL)
{
}
Para ser honesto, no estoy seguro, pero memset
también puede ser una mala idea en puntos flotantes, ya que su formato no está especificado.