C++ 为什么调用另一个对象的析构函数?

C++ 为什么调用另一个对象的析构函数?,c++,qt,qt5,C++,Qt,Qt5,我的项目创建了一个具有关联菜单的系统托盘图标。在这个菜单中,我可以点击并创建任意数量的便笺(就像那些来自windows的便笺)。但是,当我关闭最后一张便笺(通过单击窗口关闭按钮)时,会调用destruktor~Traymenu()。为什么?对象trayMenu仍有一个活动成员,即systray图标。。。 同样有趣的是,当我关闭一个便笺窗口时,析构函数Note::~Note()从未被调用 main.cpp: #include "note.h" #include "traymenu.h" #incl

我的项目创建了一个具有关联菜单的系统托盘图标。在这个菜单中,我可以点击并创建任意数量的便笺(就像那些来自windows的便笺)。但是,当我关闭最后一张便笺(通过单击窗口关闭按钮)时,会调用destruktor
~Traymenu()
。为什么?对象
trayMenu
仍有一个活动成员,即systray图标。。。 同样有趣的是,当我关闭一个便笺窗口时,析构函数
Note::~Note()
从未被调用

main.cpp:

#include "note.h"
#include "traymenu.h"
#include <QApplication>

int main(int argc, char *argv[]){
    QApplication a(argc, argv);    
    Traymenu trayMenu;    
    return a.exec();
}
#包括“note.h”
#包括“traymenu.h”
#包括
int main(int argc,char*argv[]){
质量保证申请a(argc、argv);
Traymenu Traymenu;
返回a.exec();
}
traymenu.h:

#ifndef TRAYMENU_H
#define TRAYMENU_H

#include <QSystemTrayIcon>
#include <QIcon>
#include <QPixmap>
#include <QMenu>

class Note;

class Traymenu : public QSystemTrayIcon
{
public:
    Traymenu();
    ~Traymenu();
    void createMainContextMenu();
    void newNote();
    void exitProgram();

private:
    QSystemTrayIcon mainIcon;
    QMenu mainContextMenu;
    std::vector<Note *> noteList;
};
#endif // TRAYMENU_H
\ifndef TRAYMENU\H
#定义TRAYMENU\u H
#包括
#包括
#包括
#包括
课堂笔记;
类Traymenu:公共QSystemTrayIcon
{
公众:
Traymenu();
~Traymenu();
void createMainContextMenu();
void newNote();
void exitProgram();
私人:
QSystemTrayIcon主图标;
QMenu主上下文菜单;
std::矢量记事本;
};
#endif//TRAYMENU\u H
traymenu.cpp:

#include "traymenu.h"
#include "note.h"
#include <QDebug>

Traymenu::Traymenu(){
    mainIcon.setIcon(QIcon(QPixmap("C:\\program.png")));
    mainIcon.setVisible(true);
    mainIcon.show();
    createMainContextMenu();
}
Traymenu::~Traymenu(){
    qDebug() << "in ~Traymenu()" << endl;
}
void Traymenu::newNote(){
    Note *nN; //new pointer to object of class Note
    nN = new Note(); //Initialize pointer
    noteList.push_back(nN); //add newly created object to a list
}
void Traymenu::exitProgram(){
    //delete this; //deletes traymenu object (icon disappears)
}
void Traymenu::createMainContextMenu(){
    QAction *actionNewNote = mainContextMenu.addAction("Neue Notiz");
    mainContextMenu.addSeparator();
    QAction *actionExitProgram = mainContextMenu.addAction("Programm beenden");
    actionNewNote->setIcon(QIcon("C:\\new.ico"));
    actionNewNote->setIconVisibleInMenu(true);
    QObject::connect(actionNewNote,&QAction::triggered,this,&Traymenu::newNote);
    QObject::connect(actionExitProgram,&QAction::triggered,this,&Traymenu::exitProgram);
    mainIcon.setContextMenu(&mainContextMenu);
}
#包括“traymenu.h”
#包括“附注h”
#包括
Traymenu::Traymenu(){
mainIcon.setIcon(QIcon(QPixmap(“C:\\program.png”));
mainIcon.setVisible(真);
mainIcon.show();
createMainContextMenu();
}
Traymenu::~Traymenu(){
qDebug()设置图标可视菜单(true);
QObject::connect(actionNewNote,&QAction::triggered,this,&Traymenu::newNote);
QObject::connect(actionExitProgram,&QAction::triggered,this,&Traymenu::exitProgram);
mainIcon.setContextMenu(&mainContextMenu);
}

默认情况下,Qt主事件循环在最后一个窗口关闭时退出,默认值为

因此,在创建应用程序实例后,将其设置为false,类似于:

QApplication a;
a.setQuitOnLastWindowClosed(false);

对我来说,这听起来像是一个参考问题。你没有删除向量中存储的注释。对于每一个
新的
都应该有一个
删除
。你是对的,这还没有实现。这就是为什么不调用便笺的destruktor的原因,好吧。。。但是为什么我的QSystemTrayIcon在我关闭最后一张便条后被销毁了?我看不出它是从哪里来的。哦,但不仅仅是QSystemTrayIcon,整个应用程序本身也会被终止函数返回,应用程序完成。但是关闭所有便笺窗口是如何关闭程序的?Wohoo,我已经知道这个设置,但没有注意到它,谢谢!!我仍然想知道,为什么应用程序首先需要创建一个窗口,在关闭该窗口后退出,因为一开始没有窗口。@user2366975这没有意义…:)。如果存在可以关闭的窗口,则应用程序可以因其最后一次窗口关闭而关闭。或者,若你们的意思是,若并没有窗口,应用程序怎么退出?通过像在任何程序中一样从
main
返回。。。在大多数情况下,需要调用应用程序主事件循环的
quit()
槽,因此
a.exec()呼叫返回。具体地说,关闭最后一个窗口不会退出应用程序,它只会使
a.exec()返回,程序可以在这之后执行任何操作,它不必退出。