Double gratuit ou de corruption après la file d'attente::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);
}

Après je l'exécute, j'obtiens une erreur d'exécution "double gratuit ou de corruption". Si je me débarrasser de l'destructeur de contenu (le delete), il fonctionne très bien. Quel est le problème?

  • Lire ceci puis lire ceci.
  • Test t(); déclare une fonction, votre code ne compile pas. vous avez besoin d'afficher le code réel.
  • Alors que le diaporama dans le second lien a quelque chose de bon, je ne suis pas d'accord avec eux tous, en particulier l'exemple de la page 9 montrant un local immense objet retourné par la valeur. Qui évoque à la copie de la construction qui peut être coûteux, sauf si vous êtes à l'aide de C++11 sémantique de déplacement.
  • Le diaporama parle des pointeurs intelligents comme std::unique_ptr, qui font partie du standard C++11. Je pense qu'il est sûr de supposer que c'est ce qui implique la sémantique de déplacement, à tout le moins, si ce n'est RVO.
  • Lire la Règle de Trois
  • std::unique_ptr est nouveau en C++11, mais std::shared_ptr ne l'est pas. Aussi, le diaporama mentionne std::array, ce qui n'est pas nouveau en C++11, soit. Donc, je ne pense pas que la sémantique de déplacement peuvent être pris en charge. Même avec RVO utilisé, copie de l'assignation serait invoquée sans C++11 assignation de déplacement.
  • Les deux std::shared_ptr et std::array ne sont que C++11. Il y a peut être des choses similaires en boost, mais ceux qui n'en auraient pas std:: préfixe.
  • en fait, ils ont été introduits dans TR1, puis mises à jour en C++11 pour correspondre à stimuler la fonctionnalité.
  • Juste assez. Je n'ai jamais utiliser TR1, mais je vois votre point de vue. Même alors, cependant, il serait dans l' tr1 espace de noms, pas std 😉
  • bien joué 😛
  • Cette même compiler? Ne devrait pas Test t(); être Test t?
  • Fixe. Il compile et a le même problème maintenant.
  • Malheureusement, les réponses fournies ci-dessous sont la mauvaise façon de résoudre ce problème. Vous devriez faire myArray un std::vector<int> plutôt qu'un int* alors tous les problèmes sont résolus (joint le C++ constructeurs de déplacement sont inclus dans le std::vector).

InformationsquelleAutor Mihai Neacsu | 2012-12-28