Переменная, выделенная из стека C ++, не уничтожена (/ уничтожена?)

0

Я новичок в 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++, и поэтому это не имеет никакого значения, из того, что я могу сказать...

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;
}
Теги:
destructor

2 ответа

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
    Вы будете очень разочарованы, но я просто перекомпилировал проект (clean & build), и теперь он работает как надо! Пойди разберись ...
0

Это в приложении Windows GUI (приложение Windows с точкой входа WinMain)?

Если это так, стандартный вывод не отображается автоматически при его запуске из командной строки. Я не уверен, почему это так, но IIRC работает:

myapp | cat

должен привести к правильной настройке стандартного вывода.

  • 0
    Также OP отметил, что его cout работает на cout << num .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню