warum ist eine Skalare löschen der Destruktor aufgerufen wird, als Ergebnis der Vektor löschen auf Windows?

Ich habe einen code, der undicht ist auf Windows. Es gut läuft auf vielen unix-Plattformen und das Leck tritt nur auf Windows.
Den binären besteht aus exe -, 1 dll und 2 statische libs. Die exe links, um die dll und die statische libs, während die statischen libs link mit der dll. Der Speicherverlust tritt auf, in den exe-code, wenn statt einer vector deleting destructor, aus irgendeinem Grund scalar deleting destructor aufgerufen wird. Dies führt nur das erste Objekt im array gelöscht werden, während der rest des Arrays im Arbeitsspeicher verbleibt.

Undicht pseudo-code sieht wie folgt aus:

class MyClassFromExe : public MyBaseClassFromDll {
  public:
    ClassFromDll* m_arr;

    MyClassFromExe(unsigned int size)  
    {
      m_arr = new ClassFromDll[size];
    }

    ~MyClassFromExe() 
    {
      delete [] m_arr;
    }
};

void func()
{
  MyClassFromExe obj(3);
}

Wenn func() beendet und der Destruktor aufgerufen wird sehe ich nur den Destruktor des ersten Objekts in m_arr genannt wird. Von debugger sehe ich, dass dies von scalar deleting destructor und nicht von vector deleting destructor. Dies erklärt, warum nur das erste Objekt zerstört wird.
Was brauche ich, um zu verstehen, warum scalar deleting destructor wird aufgerufen, wenn delete [] verwendet???

Fand ich diesen thread - Warum ist vector deleting destructor aufgerufen wird, als Ergebnis einer skalaren löschen?. Ich folgte die Vorschläge dort und sorgte dafür, dass alle Module kompilieren mit /MD /MD.

Wichtig zu bemerken, dass, wenn die dll enthält ClassFromDll war, eine statische Bibliothek und nicht eine dll, alles hat gut funktioniert. Das Leck nur gestartet, wenn die statische Bibliothek wurde geändert, um eine dll.
Während das Programm Lecks im Release-Modus kracht es im Debug-Modus on delete [] m_arr. Der Absturz tritt in dbgdel.cpp Linie 52 - _BLOCK_TYPE_IS_VALID(pHead->nBlockUse).

Auf unix-Plattformen diese lib ist auch eine shared lib und, wie erwartet, vector deleting destructor aufgerufen und es gibt kein Leck. Könnte das problem mit dem VC-compiler? Oder vielleicht einige andere Einstellungen der Projekte geändert werden müssen?
Ich bin mit VC2003.

Vielen Dank im Voraus!

ich fordere, dass array. in der Regel durch einen Vektor, Leute, die meinen std::vector
Wenn Sie GELTEND machen, die im debug-Modus, wenn Sie versuchen zu tun, um "RETRY" nach dem anfügen des Debuggers wo kommt der callstack Punkt ? sieht aus wie Sie haben heap-Beschädigung hier.
Dies kann nicht im Zusammenhang mit deinem problem, aber warum benutzt du eine so alte compiler-version?
Wenn ich versuche zu tun, wiederholen, nichts happends, einfach alles hängt, bis ich den debugger beenden.
Ich schrieb vector deleting destructor, da-soweit ich weiß-dies ist der name der func erstellt der compiler für das löschen von arrays.

InformationsquelleAutor noplk | 2011-02-09

Schreibe einen Kommentar