Considere el programa a continuación. Se ha simplificado a partir de un caso complejo. No puede borrar la memoria asignada anterior, a menos que elimine el destructor virtual en la clase Obj. No entiendo por qué las dos direcciones de la salida del programa son diferentes, solo si el destructor virtual está presente.¿Qué hay de malo en este uso de la ubicación nueva []? do
// GCC 4.4
#include <iostream>
using namespace std;
class Arena {
public:
void* alloc(size_t s) {
char* p = new char[s];
cout << "Allocated memory address starts at: " << (void*)p << '\n';
return p;
}
void free(void* p) {
cout << "The memory to be deallocated starts at: " << p << '\n';
delete [] static_cast<char*> (p); // the program fails here
}
};
struct Obj {
void* operator new[](size_t s, Arena& a) {
return a.alloc(s);
}
virtual ~Obj() {} // if I remove this everything works as expected
void destroy(size_t n, Arena* a) {
for (size_t i = 0; i < n; i++)
this[n - i - 1].~Obj();
if (a)
a->free(this);
}
};
int main(int argc, char** argv) {
Arena a;
Obj* p = new(a) Obj[5]();
p->destroy(5, &a);
return 0;
}
Ésta es la salida del programa en mi aplicación cuando el destructor virtual está presente:
dirección de memoria asignada comienza a las: 0x8895008 La memoria para cancelar la asignación comienza a: 0x889500c
RUN FAILED (valor de salida 1)
Por favor, no pregunte qué programa se supone que debe d o Como dije, proviene de un caso más complejo en el que Arena es una interfaz para varios tipos de memoria. En este ejemplo, la memoria solo se asigna y desasigna del montón.
Tenga en cuenta que haces * * necesita una matriz ubicación coincidentes borrar en caso de una nueva expresión se produce una excepción. –