Doppel Kostenlose oder Korruption nach Warteschlange::push

#include <queue>
using namespace std;

class Test{
    int *myArray;

        public:
    Test(){
        myArray = new int[10];
    }

    ~Test(){
        delete[] myArray;
    }

};


int main(){
    queue<Test> q
    Test t;
    q.push(t);
}

Nachdem ich diesen starte, bekomme ich eine runtime error "double free " oder Korruption". Wenn ich loszuwerden, der Destruktor Inhalt (die delete) funktioniert es einwandfrei. Was ist falsch?

  • Read this und dann read this.
  • Test t(); eine Funktion deklariert, der code wird nicht kompilieren. Sie müssen die post-code.
  • Während Sie die Diashow in das zweite Glied hat einige gute Punkte, damit bin ich nicht einverstanden mit Ihnen allen, insbesondere dem Beispiel auf Seite 9 zeigt einen lokalen großen Objekts zurückgegebenen Wert. Das ruft copy-Konstruktion, die kann teuer werden, es sei denn, Sie sind mit C++11 move-Semantik.
  • Die Diashow spricht über intelligente Zeiger wie std::unique_ptr, die Teil der C++11 standard. Ich denke, es ist sicher anzunehmen ist, impliziert move-Semantik, zumindest, wenn nicht RVO.
  • Lesen Sie in der Regel aus Drei
  • std::unique_ptr ist neu in C++11, aber std::shared_ptr ist nicht. Auch die Diashow erwähnt std::array, das ist nicht neu in C++11, entweder. Also ich glaube nicht, dass move-Semantik angenommen werden kann. Auch mit RVO verwendet, kopieren Zuordnung würde aufgerufen werden, ohne C++11 move-Zuweisung.
  • Beide std::shared_ptr und std::array sind nur C++11. Möglicherweise gibt es ähnliche Dinge in der boost, aber diese würde nicht haben eine std:: Präfix.
  • tatsächlich, Sie wurden eingeführt, TR1 und dann aktualisiert werden, in C++11 zu passen-boost-Funktionalität.
  • Fair genug. Ich habe Sie auch nie verwenden, TR1, aber ich sehe Ihren Punkt. Sogar dann, allerdings, wäre es in der tr1 namespace, nicht std 😉
  • gut gespielt 😛
  • Tut dies selbst kompilieren? Sollte nicht Test t(); werden Test t?
  • Behoben. Es kompiliert und hat das gleiche problem jetzt.
  • Leider sind die Antworten unten sind der falsche Weg, um dieses problem zu beheben. Sollten Sie myArray eine std::vector<int> eher als eine int* dann alle Probleme gelöst sind (inklusive der korrekten C++ - move-Konstruktoren enthalten sind, die in std::vector).

InformationsquelleAutor Mihai Neacsu | 2012-12-28
Schreibe einen Kommentar