Я новичок в 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;
}
Я не могу воспроизвести поведение.
#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, заключается не только в том, чтобы облегчить вам помощь, но и потому, что она может помочь вам найти, где проблема сама (что явно не в коде, который вы опубликовали).
Это в приложении Windows GUI (приложение Windows с точкой входа WinMain
)?
Если это так, стандартный вывод не отображается автоматически при его запуске из командной строки. Я не уверен, почему это так, но IIRC работает:
myapp | cat
должен привести к правильной настройке стандартного вывода.
cout
работает на cout << num
.