【发布时间】:2013-06-21 10:44:27
【问题描述】:
所以,我有以下命令模式实现,它包含在 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;
}
};
我遇到的问题是我的静态分析工具抱怨fileWriter 在IWrite 的析构函数中没有被释放或归零。但是,通过在析构函数中添加delete fileWriter,当我在调用std::map.clear() 之前删除映射中的命令模式对象时出现内存访问错误,如下所示:
// 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 fileWriter是FooClass的成员变量。
【问题讨论】:
-
您可能需要申请Rule of Three。
-
@n.m.这不是三规则(还...),这只是了解谁应该拥有这些对象的情况。
-
@Roddy:一个导致另一个。
-
@n.m.好的,如果我这样做,我会将
delete fileWriter放在IWrite的析构函数中,还是将FloatWrite和它的同类放在一起? -
@cjm571 - 解释为什么要使用指针,以及创建对象的位置以及方法。您可能根本不应该使用指针......
标签: c++ memory-management command-pattern