使用命令模式进行内存管理

Memory Management with Command Pattern

本文关键字:内存 管理 模式 命令      更新时间:2023-10-16

因此,我得到了以下命令模式实现,它包含在std::map<CString, IWrite*> commandMap:中

class IWrite
{
protected:
   CStdioFile* fileWriter;
public:
   IWrite(CStdioFile* _fileWriter)
      : fileWriter(_fileWriter)
   {
   }
   virtual ~IWrite()
   {
   }
   virtual BOOL exec() = 0;
};

class FloatWrite : public IWrite
{
private:
   float input;
public:
   FloatWrite(CStdioFile* _fileWriter, float _input)
      : IWrite(_fileWriter), input(_input)
   {      
   }
   BOOL exec()
   {
      CString fieldvalue;
      fieldvalue.Format("%f", input);
      fileWriter->WriteString(fieldvalue);
      return TRUE;
   }
};

我遇到的问题是,我的静态分析工具抱怨fileWriterIWrite的析构函数中没有释放或归零。然而,通过在析构函数中添加delete fileWriter,当我在调用std::map.clear()之前删除映射中的Command Pattern对象时,我会出现内存访问错误,如下所示:

// free map memory
for ( std::map<CString, IWrite*>::iterator mapItr = commandMap.begin();
      mapItr != commandMap.end();
      ++mapItr)
{
   delete mapItr->second;
}
commandMap.clear();

我是不是在错误地处理内存管理?我没有做太多关于STL映射的工作,所以我不熟悉惯用方法。

编辑:如何在地图上添加元素:

void FooClass::initCommandMap(const MSG_DATA_STRUCT * msgdata)
{
   // Write a float, foo
   commandMap[_T("foo")] = new FloatWrite(&fileWriter, msgdata->foo);
   // Write an unsigned int, bar
   commandMap[_T("bar")] = new UIntWrite(&fileWriter, msgdata->bar);
   // etc...
}

每当用户选择写出数据时都会调用此函数,因此各种exec()使用的fileWriter对象与用户选择的文件是当前的。

注意,CStdioFile fileWriterFooClass的成员变量。

为什么要保留指向fileWriter的指针?据我所见,您的Command对象假定在使用该命令之前应该存在一个编写器。它也不应该试图管理编写器对象,因为它可以由多个命令对象共享。试着保留一个参考。

class IWrite
{
protected:
   CStdioFile &fileWriter;
public:
   IWrite(CStdioFile &_fileWriter)
      : fileWriter(_fileWriter)
   {
   }
   virtual ~IWrite()
   {
   }
   virtual BOOL exec() = 0;
};