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; // 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) FunkyNumber::~FunkyNumber() { int FunkyNumber::intValue() const { void FunkyNumber::operator+=(const FunkyNumber &other) { void FunkyNumber::operator=(const FunkyNumber &other) { bool FunkyNumber::operator==(const FunkyNumber &other) { std::ostream &operator<<(std::ostream &outStream, const FunkyNumber &num) { 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{ FunkyNumber::~FunkyNumber() { int FunkyNumber::intValue() const { void FunkyNumber::operator+=(const FunkyNumber &other) { void FunkyNumber::operator=(const FunkyNumber &other) { bool FunkyNumber::operator==(const FunkyNumber &other) { std::ostream &operator<<(std::ostream &outStream, const FunkyNumber &num) { return outStream; void call(){ num += num2; // Should be destroyed here! int main(int argc, char **argv){ |
这很好用。人们推广 SSCCE 的原因不仅是为了更容易帮助您,还因为它可以帮助您自己找到问题所在(这显然不在您发布的代码中)。
- 你会非常失望,但我刚刚重新编译了项目(干净
这是在 Windows GUI 应用程序中吗(带有 WinMain 入口点的 Windows 应用程序)?
如果是,从命令行运行时标准输出不会自动显示。我不确定这是为什么,但 IIRC 正在运行:
1
|
myapp | cat
|
应该可以正确设置标准输出。
来源:https://www.codenong.com/19385970/