请教一个Strategy实现的问题

rabbit729 2008-09-02 10:03:33
小弟使用如下代码实现了Strategy模式,感觉里面好像存在内存泄漏的情况,请各位高手帮忙分析一下,代码如下:
/***********Strategy.h******************/
// ***************************************************************
// Strategy version: 1.0 · date: 09/01/2008
// -------------------------------------------------------------

// -------------------------------------------------------------
// Copyright (C) 2008 - All Rights Reserved
// ***************************************************************

#ifndef STRATEGY_H_
#define STRATEGY_H_

class WeaponBehavior;

class Character
{
public:
Character();
Character(WeaponBehavior* pWeapon);

~Character();

void fight();
void SetWeapon(WeaponBehavior* w);

private:
WeaponBehavior* m_weapor;

};

class Queue : public Character
{
public:
Queue();
~Queue();
};

class King : public Character
{
public:
King();
~King();
};

class WeaponBehavior
{
public:
WeaponBehavior();
~WeaponBehavior();

virtual void useWeapon() = 0;
};

class KnifeBehvior : public WeaponBehavior
{
public:
KnifeBehvior();
~KnifeBehvior();

virtual void useWeapon();
};

class SwordBehavior : public WeaponBehavior
{
public:
SwordBehavior();
~SwordBehavior();

virtual void useWeapon();
};

#endif

/************Strategy.cpp********************/
#include "Strategy.h"
#include <iostream>

using namespace std;

Character::Character():m_weapor(NULL)
{

}

Character::Character(WeaponBehavior* pWeapon)
{
m_weapor = pWeapon;
}

Character::~Character()
{
if (m_weapor != NULL)
{
delete m_weapor;
m_weapor = NULL;
}
}

void Character::fight()
{
m_weapor->useWeapon();
}

void Character::SetWeapon(WeaponBehavior* w)
{
m_weapor = w;
}

Queue::Queue():Character(new KnifeBehvior())
{

}

Queue::~Queue()
{

}

King::King():Character(new SwordBehavior())
{

}

King::~King()
{

}

WeaponBehavior::WeaponBehavior()
{

}

WeaponBehavior::~WeaponBehavior()
{

}

KnifeBehvior::KnifeBehvior()
{

}

KnifeBehvior::~KnifeBehvior()
{

}

void KnifeBehvior::useWeapon()
{
cout<<"Fight use Knife!"<<endl;
}

SwordBehavior::SwordBehavior()
{

}

SwordBehavior::~SwordBehavior()
{

}

void SwordBehavior::useWeapon()
{
cout<<"Fight use Sword!"<<endl;
}

/*************Main.cpp*******************/
#include "Strategy.h"

void main()
{
Character* character = new King();
character->fight();

WeaponBehavior* pWeapon = new KnifeBehvior();
character->SetWeapon(pWeapon);
character->fight();

delete character;
character = 0;
}

上面代码在执行时不会出现问题,但是我感觉是不是得使用delete pWeapon;释放pWeapon,不过加上的话执行是弹出错误,请大家帮忙分析一下,上面代码是否存在内存泄漏,谢谢!
...全文
138 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
changsheng230 2008-10-04
  • 打赏
  • 举报
回复

void main()
{
Character* character = new King();
character->fight();

WeaponBehavior* pWeapon = new KnifeBehvior();
character->SetWeapon(pWeapon);
character->fight();

WeaponBehavior* pAnotherWeapon = new SwordBehavior;
character->SetWeapon(pAnotherWeapon);

delete character;
character = 0;
}

//用auto_ptr更好,只要别把指针穿来传去得:

void main()
{
std::auto_ptr<Character*> character(new King());
character->fight();
std::auto_ptr<WeaponBehavior*> pWeapon (new KnifeBehvior());
character->SetWeapon(pWeapon);
character->fight();
std::auto_ptr<WeaponBehavior*> pAnotherWeapon (new KnifeBehvior());

character->SetWeapon(pAnotherWeapon);
}

wjzhang_1983 2008-10-03
  • 打赏
  • 举报
回复
jeffchen 正解
gezichong 2008-09-19
  • 打赏
  • 举报
回复
这个文章:

http://www.cnblogs.com/chengy024/archive/2008/04/28/1175033.html

和LZ的一样
mxm324 2008-09-17
  • 打赏
  • 举报
回复
同上...不过在赋予行为的时候需要看你的这些行为会不会被其它character共享...因为其实很多时候并不需要每次替换一个行为就去new一个行为..用原来的也行..这个时候就要考虑delete问题了...
wuliang_227 2008-09-03
  • 打赏
  • 举报
回复
目前看上去确实没有内存泄露,但如果这样用就有问题了:

void main()
{
Character* character = new King();
character->fight();

WeaponBehavior* pWeapon = new KnifeBehvior();
character->SetWeapon(pWeapon);
character->fight();

WeaponBehavior* pAnotherWeapon = new SwordBehavior;
character->SetWeapon(pAnotherWeapon);

delete character;
character = 0;
}


本着谁new谁delete的原则,我认为 Character::SetWeapon 可以这样:

WeaponBehavior* Character::SetWeapon(WeaponBehavior* w)
{
WeaponBehavior* pRetWeapor = NULL;

if(m_weapor != w)
{
pRetWeapor = m_weapor;
m_weapor = w;
}

return pRetWeapor;
}

void main()
{
Character* character = new King();
character->fight();

WeaponBehavior* pWeapon = new KnifeBehvior();
character->SetWeapon(pWeapon);
character->fight();

WeaponBehavior* pAnotherWeapon = new SwordBehavior;
WeaponBehavior* pNeedFreeWeapon = character->SetWeapon(pAnotherWeapon);
if(pNeedFreeWeapon)
{
delete pNeedFreeWeapon;
pNeedFreeWeapon = NULL;
}
delete character;
character = 0;
}
jeffchen 2008-09-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuliang_227 的回复:]
目前看上去确实没有内存泄露,但如果这样用就有问题了:

C/C++ code
void main()
{
Character* character = new King();
character->fight();

WeaponBehavior* pWeapon = new KnifeBehvior();
character->SetWeapon(pWeapon);
character->fight();

WeaponBehavior* pAnotherWeapon = new SwordBehavior;
character->SetWeapon(pAnotherWeapon);

delete character;
character = 0;
}




本着谁new谁…
[/Quote]

我建议这样写:
C/C++ code
void Character::SetWeapon(WeaponBehavior* w)
{
if(m_weapor != NULL)
{
delete m_weapor;
m_weapor = NULL;
}

m_weapor = w;
}

void main()
{
Character* character = new King();
character->fight();

character->SetWeapon(new KnifeBehvior());
character->fight();

character->SetWeapon(new SwordBehavior());

delete character;
character = 0;
}

冷月清晖 2008-09-02
  • 打赏
  • 举报
回复
无泄漏,同上,

所以无论你:先delete pWeapon;

再 delete character; 还是反过来
都会报错,因为虽然上面你做了m_weapor = NULL;
但是main中的变量还是有值,非空判断也失效。
e_sharp 2008-09-02
  • 打赏
  • 举报
回复
Character::~Character() //pWeapon 在这里释放 
{
if (m_weapor != NULL)
{
delete m_weapor;
m_weapor = NULL;
}
}

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧