Files
Goober5000andClaude Opus 5 09fc7055b5 Fix FRED and qtFRED memory leaks at exit (#7784)
Neither editor had a teardown to match FSO's game_shutdown(), so the engine
data they set up was never freed.  Add editor_free_engine_data() to free it,
and call it from a new fred_shutdown() in FRED and from qtFRED's shutdown(),
before the graphics system closes.

Also:
- Delete FRED's modeless editors if they are still open at exit.
- Make FRED's dialog tooltips and sexp tree image lists members, since
  they were leaked or depended on OnDestroy() being called.
- Parent qtFRED's item models so they are deleted with their widgets.
- Enable the CRT leak report in qtFRED, which previously had none.
- In qtFRED, call shutdown() last in closeEvent(), since it destroys the
  window.
- Make the preferences path and user SID strings function-level statics,
  so MFC's leak dump no longer reports them as leaks.

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
2026-09-21 05:12:35 +02:00

103 lines
2.9 KiB
C++

/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#if !defined(AFX_MODIFYVARIABLEDLG_H__710D45F1_ABBF_11D2_A89A_0060088FAE88__INCLUDED_)
#define AFX_MODIFYVARIABLEDLG_H__710D45F1_ABBF_11D2_A89A_0060088FAE88__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ModifyVariableDlg.h : header file
//
#include "parse/sexp.h"
/////////////////////////////////////////////////////////////////////////////
// CModifyVariableDlg dialog
class CModifyVariableDlg : public CDialog
{
// Construction
public:
CModifyVariableDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CModifyVariableDlg)
enum { IDD = IDD_MODIFY_VARIABLE };
CString m_cur_variable_name;
CString m_default_value;
CString m_old_var_name;
bool m_type_number;
bool m_type_on_mission_close;
bool m_type_on_mission_progress;
bool m_type_eternal;
bool m_type_network_variable;
bool m_modified_name;
bool m_modified_value;
bool m_modified_type;
bool m_modified_persistence;
bool m_deleted;
bool m_data_validated;
bool m_var_name_validated;
bool m_do_modify;
int m_combo_last_modified_index;
int m_translate_combo_to_sexp[MAX_SEXP_VARIABLES];
int m_start_index; // index of sexp_variables which is right clicked to get this menu
sexp_tree_view *m_p_sexp_tree;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CModifyVariableDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
private:
bool IsChangeSafe(char *message);
protected:
// tooltips
CToolTipCtrl m_ProgressToolTip;
CToolTipCtrl m_CloseToolTip;
CToolTipCtrl m_EternalToolTip;
// Generated message map functions
//{{AFX_MSG(CModifyVariableDlg)
afx_msg void OnDeleteVariable();
afx_msg void OnTypeString();
afx_msg void OnTypeNumber();
afx_msg void OnTypeMissionClose();
afx_msg void OnTypeMissionProgress();
afx_msg void OnTypeEternal();
afx_msg void OnTypeNetworkVariable();
afx_msg void OnSelchangeModifyVariableName();
afx_msg void OnEditchangeModifyVariableName();
virtual BOOL OnInitDialog();
BOOL PreTranslateMessage(MSG * pMsg);
virtual void OnOK();
afx_msg void OnKillfocusModifyDefaultValue();
afx_msg void set_variable_type();
afx_msg void validate_data(CString &temp_data, int set_focus);
afx_msg void validate_var_name(int set_focus);
afx_msg int get_sexp_var_index();
afx_msg void OnDropdownModifyVariableName();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MODIFYVARIABLEDLG_H__710D45F1_ABBF_11D2_A89A_0060088FAE88__INCLUDED_)