tengo esta claseC++ pérdida de memoria cuando se utiliza std :: string en la matriz de memoria compartida
class LayoutEntry
{
unsigned int id_;
string name_;
bool isInput_;
};
El constructor de copia se ve así:
LayoutEntry(const LayoutEntry &other)
: id_(other.id_),
name_(other.name_),
isInput_(other.isInput_)
{
}
objetos de esta clase se ponen dentro de un mapa dentro de otra clase
class DataLayoutDescription
{
unsigned int sz_;
set<LayoutEntry, SortByOffset> impl;
// HERE!!!
map<unsigned int, LayoutEntry> mapById;
El constructor de copia de esta clase tiene el siguiente aspecto:
DataLayoutDescription::DataLayoutDescription(const DataLayoutDescription &other)
:sz_(other.sz_), impl(other.impl), mapById(other.mapById)
{
}
Ahora la pregunta:
- I Get una pérdida de memoria para cada LayoutEntry cuando se ejecuta como impreso
- Si quito
mapById(other.mapById)
en el constructor copia de DataLayoutDescription entonces no hay memleak - Si elimino
name_(other.name_),
Las pérdidas de memoria también se han ido
¿Por qué?
EDITAR
Para la prueba I impulsar el uso :: unittest al final consigo un vertedero de pérdida de memoria
C:\wc\05_EAPGit\Debug>EapLibTest.exe --run-test=SharedVectorTest
Running 7 test cases...
*** No errors detected
Detected memory leaks!
Dumping objects ->
{1378} normal block at 0x005815C0, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{1377} normal block at 0x00581580, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{1376} normal block at 0x00581540, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Razón Posible? que persisten la DataLayoutDescription en un área de memoria compartida utilizando este método
void DataLayoutDescription::Save(LayoutEntry *les, unsigned int maxEntries) const
{
int n = std::max(impl.size(), maxEntries);
int i = 0;
for (DataLayoutDescription::iterator it = begin(); it != end(); ++it)
{
les[i] = *it; // Source of memory leak here???
++i;
}
}
que eliminar la referencia de la tienda hormiga iterador una copia de esta en la matriz que se encuentra en la región de memoria compartida. ¿Hay algo mal? La memoria compartida se elimina al salir.
furhter Trackdown El LayoutEntry clase se coloca en una matriz dentro de un área de memoria compartida y contiene una cadena. El motivo de la pérdida de memoria es que la cadena se redimensiona. Por lo tanto, asigna más memoria en el montón. Ahora supongo que esta memoria no se liberará ya que la memoria original se encuentra en la memoria compartida. Podría ser ésta la razón? Lo siguiente que intentaré es eliminar la cadena y reemplazarla por una matriz de caracteres de longitud fija.
... después de varios minutos
Ésta era la misma. Después de reemplazar la cadena con una matriz fija de char, la pérdida de memoria desapareció. Espero que esto ayude a alguien.
Esto se ve perfecto. ¿Qué te hace pensar que hay pérdida de memoria aquí? –
No hay fuga de memoria aparente en el código que ha publicado. ¿Por qué crees que tienes uno? –
Agregué el volcado – schoetbi