C++ 基于命令模式的内存管理

C++ 基于命令模式的内存管理,c++,memory-management,command-pattern,C++,Memory Management,Command Pattern,因此,我得到了以下命令模式实现,它包含在std::map commandMap中: 类IWrite { 受保护的: CStdioFile*文件编写器; 公众: IWrite(CStdioFile*\u文件写入器) :fileWriter(_fileWriter) { } 虚拟~IWrite() { } 虚拟BOOL exec()=0; }; class FloatWrite:public IWrite { 私人: 浮点输入; 公众: FloatWrite(CStdioFile*\u文件编写器

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

类IWrite
{
受保护的:
CStdioFile*文件编写器;
公众:
IWrite(CStdioFile*\u文件写入器)
:fileWriter(_fileWriter)
{
}
虚拟~IWrite()
{
}
虚拟BOOL exec()=0;
};

class FloatWrite:public IWrite
{
私人:
浮点输入;
公众:
FloatWrite(CStdioFile*\u文件编写器,float\u输入)
:IWrite(_fileWriter),input(_input)
{      
}
BOOL exec()
{
CString字段值;
格式(“%f”,输入);
fileWriter->WriteString(字段值);
返回TRUE;
}
};
我遇到的问题是,我的静态分析工具抱怨
fileWriter
IWrite
的析构函数中没有被释放或归零。但是,通过在析构函数中添加一个
delete fileWriter
,当我在调用
std::map.clear()
之前删除映射中的命令模式对象时,会出现内存访问错误,如下所示:

//释放映射内存
for(std::map::iterator mapItr=commandMap.begin();
mapItr!=commandMap.end();
++mapItr)
{
删除mapItr->second;
}
commandMap.clear();
我在内存管理方面有错误吗?我没有对STL映射做太多的工作,所以我不熟悉惯用的方法

编辑:如何向地图添加元素:

void FooClass::initCommandMap(const MSG_DATA_STRUCT*msgdata)
{
//写一个浮点数,foo
commandMap[\u T(“foo”)]=newfloatwrite(&fileWriter,msgdata->foo);
//写一个无符号int,bar
commandMap[_T(“bar”)]=新的UIntWrite(&fileWriter,msgdata->bar);
//等等。。。
}
每次用户选择写入数据时都会调用此函数,因此各种
exec()
所使用的
fileWriter
对象与用户选择的文件是最新的


请注意,
cstdoifile fileWriter
FooClass

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

class IWrite
{
protected:
   CStdioFile &fileWriter;

public:
   IWrite(CStdioFile &_fileWriter)
      : fileWriter(_fileWriter)
   {
   }

   virtual ~IWrite()
   {
   }

   virtual BOOL exec() = 0;
};

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

class IWrite
{
protected:
   CStdioFile &fileWriter;

public:
   IWrite(CStdioFile &_fileWriter)
      : fileWriter(_fileWriter)
   {
   }

   virtual ~IWrite()
   {
   }

   virtual BOOL exec() = 0;
};


您可能需要应用@n.m.这不是三个规则(但…),这只是一个理解谁应该拥有这些对象的案例。@Roddy:一个导致另一个。@n.m.好的,如果我要这样做,我会把
删除fileWriter
放在
IWrite
的析构函数中吗,或者
FloatWrite
及其类似内容?@cjm571-解释为什么要使用指针,在哪里创建对象,以及如何创建。很有可能你根本不应该使用指针……你可能需要应用@n.m.这不是三法则(但…),这只是一个理解谁应该拥有这些对象的例子。@Roddy:一个指向另一个。@n.m.好吧,如果我要这么做,我是否将
delete fileWriter
放在
IWrite
的析构函数中,还是将
FloatWrite
及其类似的函数中?@cjm571-解释为什么要使用指针,在何处创建对象,以及如何创建对象。很可能你根本就不应该使用指针……但这不是违法的吗
CStdioFile
是不可复制的
CObject
的子项。因此,初始值设定项列表中的
fileWriter(\u fileWriter)
会导致编译错误,至少以下代码是用g++编译的:。您能显示您的代码和收到的错误消息吗?@cjm571这不是副本;它是推荐会员。确保您的成员是一个参考变量;不是平面实例变量。@Grigory当我添加
fileWriter=dataIn.fileWriter时
,其中
dataIn
operator=
重载中的
IWrite&
参数,我得到一个错误
C2248:'CObject::operator=':无法访问类'CObject'中声明的私有成员。
请注意,这也是在将
fileWriter
更改为
CStdioFile&
之后,这就是我使用指针的最初原因。由于我的映射值是
IWrite*
,因此从未使用
IWrite
操作符=
,因此也不需要
CObject::operator=
。这不是违法的吗
CStdioFile
是不可复制的
CObject
的子项。因此,初始值设定项列表中的
fileWriter(\u fileWriter)
会导致编译错误,至少以下代码是用g++编译的:。您能显示您的代码和收到的错误消息吗?@cjm571这不是副本;它是推荐会员。确保您的成员是一个参考变量;不是平面实例变量。@Grigory当我添加
fileWriter=dataIn.fileWriter时
,其中
dataIn
operator=
重载中的
IWrite&
参数,我得到一个错误
C2248:'CObject::operator=':无法访问类'CObject'中声明的私有成员。
请注意,这也是在将
fileWriter
更改为
CStdioFile&
之后,这就是我使用指针的最初原因。由于我的映射值是
IWrite*
,因此从未使用
IWrite
运算符=
,因此也不需要
CObject::operator=