From 354992c522048c8e1bfd3b786841e7be4ca2ef9f Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 15 Mar 2001 10:42:43 -0500 Subject: [PATCH] BUG: Fixed segfault when CABLE_PACKAGE is only CABLE command. Related to order of virtual destructor calls. --- Source/cmCablePackageCommand.cxx | 19 ++++++++++++++++++- Source/cmCablePackageCommand.h | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Source/cmCablePackageCommand.cxx b/Source/cmCablePackageCommand.cxx index 73f8f18c0..4c334a74f 100644 --- a/Source/cmCablePackageCommand.cxx +++ b/Source/cmCablePackageCommand.cxx @@ -16,6 +16,23 @@ #include "cmCablePackageCommand.h" #include "cmCacheManager.h" + +cmCablePackageCommand::~cmCablePackageCommand() +{ + // If we are the owner of the cmCableData, we must delete it here. + // For most cmCableCommands, the cmCableCommand destructor will take + // care of this. If this package happens to be the last one, and is + // the owner, then the destructor of cmCableData will call back to a method + // in this class after the package part of it has been freed! + if(m_CableData && m_CableData->OwnerIs(this)) + { + delete m_CableData; + // Make sure our superclass's destructor doesn't try to delete the + // cmCableData too. + m_CableData = NULL; + } +} + // cmCablePackageCommand bool cmCablePackageCommand::Invoke(std::vector& args) { @@ -30,7 +47,7 @@ bool cmCablePackageCommand::Invoke(std::vector& args) // The argument is the package name. m_PackageName = args[0]; - + // Ask the cable data to begin the package. This may call another // cmCablePackageCommand's WritePackageFooter(). This will call // this cmCablePackageCommand's WritePackageHeader(). diff --git a/Source/cmCablePackageCommand.h b/Source/cmCablePackageCommand.h index b8a76c7b7..e240ea1ed 100644 --- a/Source/cmCablePackageCommand.h +++ b/Source/cmCablePackageCommand.h @@ -30,7 +30,7 @@ class cmCablePackageCommand : public cmCableCommand { public: cmCablePackageCommand() {} - virtual ~cmCablePackageCommand() {} + virtual ~cmCablePackageCommand(); /** * This is a virtual constructor for the command.