2013-10-15 62 views
0

我很新的C++,但我想我就在棧上宣佈說對象應該自動地被破壞/破壞,當他們走出去的範圍有多大?在我目前正在處理的小型項目中,情況並非如此。C++堆棧中分配變量不破壞(/銷燬?)

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

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

    // Should be destroyed here! 
} 

我的析構函數應該這樣做:

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

但沒有出來爲標準了!

或許應該提,我使用Qt - 但是這僅僅是一個普通的C++類,因此這應該不是真正的問題,從我可以告訴...

編輯: 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

的對象被摧毀,你只是沒有看到它無論出於何種原因。 – juanchopanza

+3

你可以將整個FunkyNumber類添加到帖子嗎? – RonenKr

+0

將不得不看到更多的代碼 - 可能很簡單,因爲不使用析構函數實現,而是調用默認(空)析構函數。 –

回答

0

我無法重現行爲。

#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; 
} 

這工作正常。人們推銷SSCCE的原因不僅在於更容易幫助您,而且還因爲它可以幫助您找到問題出在哪裏(顯然不在您發佈的代碼中)。

+0

你會感到非常失望,但我只是重新編譯這個項目(清理和構建),現在它就像它應該做的那樣工作!去搞清楚... – Javawag

0

這是在Windows GUI應用程序(用WinMain切入點Windows應用程序)?

如果是,標準輸出不自動在命令行中運行時,它顯示出來。我不確定這是爲什麼,但IIRC運行:

myapp | cat 

應導致標準輸出設置正確。

+0

此外OP提到,他的'cout'工程'的cout << num'。 – deepmax