Fuga de memoria en C++ con puntero de clase
Estoy intentando escribir algunas clases, aprendiendo c++ y tengo el siguiente problema:
1. He creado una clase de la siguiente manera:
class my_string
{
private:
char* buf = nullptr;
unsigned int size = 0;
public:
my_string() : buf(nullptr), size(0) // constructor por defecto
{
}
my_string(const char* buffer) // constructor
{
size = strlen(buffer);
buf = (char*)malloc(sizeof(char) * (size + 1)); // + 1 para mantener el carácter nulo
memcpy(buf, buffer, size);
}
my_string(const my_string& obj) // constructor de copia
{
size = obj.size;
buf = (char*)malloc(sizeof(char) * (size + 1)); // + 1 para mantener el carácter nulo
memcpy(buf, obj.buf, size);
}
my_string& operator=(const my_string& obj) // asignación de copia
{
// limpiar cualquier dato existente
// Copiar datos del nuevo objeto my_string asignado
size = obj.size;
buf = (char*)malloc(sizeof(char) * (size + 1)); // + 1 para mantener el carácter nulo
memcpy(buf, obj.buf, size);
return *this;
}
};
2. Hago algo como esto:
while (true) {
my_string* www4 = (my_string*)malloc(sizeof(my_string));
www4[0] = "kek";
free(&www4[0]);
free(www4);
}
Y tengo una fuga de memoria: la memoria del proceso aumenta hasta 150 MB durante 1-2 segundos. ¿Qué está mal? ¿No libero todo?
davy.ai
El problema se encuentra en la línea
www4[0] = "kek";
. Aquí, estás asignando un literal de cadena a un objetomy_string
, lo cual no es una operación válida. En el constructor demy_string
, se asigna memoria utilizandomalloc()
, pero no se libera en ningún lugar. Por lo tanto, hay una fuga de memoria en el código. Para solucionarlo, puedes modificar el constructor demy_string
y el operador de asignación por copia para utilizarfree()
y liberar la memoria asignada. Además, debes usar el operadornew
en lugar demalloc()
para crear objetos de la clasemy_string
. Aquí tienes una implementación modificada de la clasemy_string
:Y aquí tienes el código modificado para crear y liberar objetos de
my_string
:Usar
new
para crear objetos demy_string
asegura que la memoria se asigna y se libera correctamente. El destructor demy_string
se llama automáticamente cuando se utiliza el operadordelete
para liberar la memoria. Además, ten en cuenta que no es necesario llamar afree()
en el objetowww4[0]
, ya que no se crea utilizandomalloc()
.