2013-10-15 2 views
0

Je ne suis pas familier avec le C++, mais je pense que j'ai raison de dire que les objets déclarés sur la pile devraient être automatiquement détruits/détruits lorsqu'ils sortent de la portée. Dans le mini-projet sur lequel je travaille en ce moment, ce n'est pas le cas.La variable affectée à la pile C++ n'est pas détruite (/ détruit?)

void MainWindow::clickTest() { 
    FunkyNumber num = 4; 
    FunkyNumber num2 = 6; 

    num += num2; 
    std::cout << num << std::endl; // This works okay! 

    // Should be destroyed here! 
} 

Mon destructor devrait faire ceci:

virtual FunkyNumber::~FunkyNumber() { 
    std::cout << "goodbye cruel world! (" << m_intValue << ")" << std::endl; 
    // m_intValue is just the int value of this "FunkyNumber" 
} 

Mais rien ne sort en sortie standard!

devrait mentionner probablement que je utilise Qt - mais ceci est juste une classe C++ simple et donc cela ne devrait pas vraiment de ce que je peux dire ...

EDIT: funkynumber.cpp:

#include "funkynumber.h" 

FunkyNumber::FunkyNumber(int num) 
    : m_intValue(num) { 
    std::cout << "made a funkynumber " << num << std::endl; 
} 

FunkyNumber::~FunkyNumber() { 
    std::cout << "goodbye cruel world! (" << m_intValue << ")" << std::endl; 
} 

int FunkyNumber::intValue() const { 
    return m_intValue; 
} 

void FunkyNumber::operator+=(const FunkyNumber &other) { 
    m_intValue += other.intValue(); 
} 

void FunkyNumber::operator=(const FunkyNumber &other) { 
    m_intValue = other.intValue(); 
} 

bool FunkyNumber::operator==(const FunkyNumber &other) { 
    return other.intValue() == m_intValue; 
} 

std::ostream &operator<<(std::ostream &outStream, const FunkyNumber &num) { 
    outStream << "FunkyNumber (" << num.intValue() << ")"; 

    return outStream; 
} 
+0

Les objets sont détruits, vous ne les voyez pas pour une raison quelconque. – juanchopanza

+3

pouvez-vous ajouter la classe entière FunkyNumber au poste s'il vous plaît? – RonenKr

+0

Devrait voir plus de code - pourrait être quelque chose d'aussi simple que votre implémentation de destructeur n'est pas utilisée et le destructeur (vide) par défaut est appelé à la place. –

Répondre

0

Je ne peux pas reproduire le comportement.

#include<iostream> 

struct FunkyNumber{ 
    int m_intValue; 
    FunkyNumber::FunkyNumber(int num) 
     : m_intValue(num) { 
      std::cout << "made a funkynumber " << num << std::endl; 
    } 

    FunkyNumber::~FunkyNumber() { 
     std::cout << "goodbye cruel world! (" << m_intValue << ")" << std::endl; 
    } 

    int FunkyNumber::intValue() const { 
     return m_intValue; 
    } 

    void FunkyNumber::operator+=(const FunkyNumber &other) { 
     m_intValue += other.intValue(); 
    } 

    void FunkyNumber::operator=(const FunkyNumber &other) { 
     m_intValue = other.intValue(); 
    } 

    bool FunkyNumber::operator==(const FunkyNumber &other) { 
     return other.intValue() == m_intValue; 
    } 
}; 

std::ostream &operator<<(std::ostream &outStream, const FunkyNumber &num) { 
    outStream << "FunkyNumber (" << num.intValue() << ")"; 

    return outStream; 
} 

void call(){ 
    FunkyNumber num = 4; 
    FunkyNumber num2 = 6; 

    num += num2; 
    std::cout << num << std::endl; // This works okay! 

    // Should be destroyed here! 
} 

int main(int argc, char **argv){ 
    call(); 
    std::cout << "call ended" << std::endl; 
} 

Cela fonctionne très bien. La raison pour laquelle les gens font la promotion SSCCE est non seulement de vous faciliter la tâche, mais aussi de vous aider à trouver où vous en êtes (ce qui n'est clairement pas dans le code que vous avez publié).

+0

Vous allez être vraiment déçu, mais j'ai juste recompilé le projet (clean & build), et maintenant ça marche comme il se doit! Allez comprendre... – Javawag

0

Est-ce dans une application Windows GUI (application Windows avec un point d'entrée WinMain)?

Si tel est le cas, la sortie standard ne s'affiche pas automatiquement lors de l'exécution à partir de la ligne de commande. Je ne suis pas sûr de savoir pourquoi, mais IIRC en cours d'exécution:

myapp | cat 

devrait entraîner la configuration de la sortie standard correctement.

+0

Aussi OP a mentionné que son' cout' fonctionne pour 'cout << num'. – deepmax

Questions connexes