关于析构函数:C 堆栈分配的变量未销毁(/destroyed?) | 珊瑚贝

C++ stack allocated variable not destructed (/destroyed?)


我对 C 语言很陌生,但我认为我说得对,在堆栈上声明的对象应该在超出范围时自动销毁/销毁?在我目前正在使用的迷你项目中,情况并非如此。

1
2
3
4
5
6
7
8
9
void MainWindow::clickTest() {
    FunkyNumber num = 4;
    FunkyNumber num2 = 6;

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

    // Should be destroyed here!
}

我的析构函数应该这样做:

1
2
3
4
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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;
}

  • 物体正在被摧毁,你只是出于某种原因看不到它。
  • 你能把整个 FunkyNumber 类添加到帖子中吗?
  • 将不得不查看更多代码 – 可能就像您的析构函数实现没有被使用并且正在调用默认(空)析构函数一样简单。
  • 使用调试器并在析构函数中设置断点。
  • 您是否在控制台/终端中运行它?
  • 您显示的代码应该完全按照您的预期运行。您需要提供更多详细信息。
  • 我很乐意帮忙,但我的水晶球目前正在维修中!说真的,如果您不显示代码,您怎么能指望我们提供帮助?提供 SSCCE。
  • 好吧好吧,我不知道这是否足以让精通 C 的人诊断它!请参阅上面的完整源代码 FunkyNumber.cpp 的编辑。可能应该提到构造函数的输出是可见的,而不是析构函数!
  • 在 clickTest() 方法返回后尝试输出一些东西 – 可能析构函数输出没有刷新到输出流。
  • 请证明 SSCCE。您可以将重现此过程所需的所有内容放在一个文件中。在大约 15-20 行代码中应该是可行的。
  • @luriCovalisin 怀疑它, std::endl 刷新


我无法重现该行为。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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 应用程序中吗(带有 WinMain 入口点的 Windows 应用程序)?

如果是,从命令行运行时标准输出不会自动显示。我不确定这是为什么,但 IIRC 正在运行:

1
myapp | cat

应该可以正确设置标准输出。


来源:https://www.codenong.com/19385970/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?