[英]Why am I getting munmap_chunk(): invalid pointer: error
因此,當我嘗試在 class 字符中的“setweapon”function 中“刪除”先前分配的武器行為時,我正在做一些分配並突然面臨這個“無效指針”錯誤。 有人可以就可能出現的問題給出一些指示嗎?
#include <iostream>
using namespace std;
class WeaponBehaviour{
public:
virtual void useWeapon() = 0;
};
class SwordBehaviour : public WeaponBehaviour {
public:
void useWeapon()
{
cout << "slash slash"<< endl;
}
};
class BowAndArrowBehavior : public WeaponBehaviour {
public:
void useWeapon()
{
cout << "suss suss"<< endl;
}
};
class KnifeBehavior : public WeaponBehaviour {
public:
void useWeapon()
{
cout << "chak chakk"<< endl;
}
};
class AxeBehavior : public WeaponBehaviour {
public:
void useWeapon()
{
cout << "chop chop"<< endl;
}
};
class Character{
protected:
WeaponBehaviour* weaponBehaviour;
public:
Character(){
}
~Character(){
if(weaponBehaviour != NULL)
{
delete weaponBehaviour;
}
}
void setWeapon(WeaponBehaviour* newWeapon)
{
if(weaponBehaviour!= NULL )
delete weaponBehaviour;
weaponBehaviour = newWeapon;
}
void fight()
{
weaponBehaviour->useWeapon();
}
};
class King : public Character
{
public:
King(){
setWeapon(new SwordBehaviour);
}
};
class Queen : public Character
{
public:
Queen(){
setWeapon(new KnifeBehavior);
}
};
int main() {
King king ;
king.fight();
Queen queen ;
queen.fight();
queen.setWeapon(new AxeBehavior);
queen.fight();
return 0;
}
我得到的錯誤是
* `Cpp-design-patters/Debug/strategy-pattern' 中的錯誤:munmap_chunk():無效指針:0x0000000000400f50 * ======= 回溯:========/lib/x86_64-linux -gnu/libc.so.6(+0x777e5)[0x7ff746d757e5] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x1a8)[0x7ff746d82698]
您需要將weaponBehaviour
初始化為nullptr
否則weaponBehaviour
將有一個未定義的(可能是非空的)值和
if(weaponBehaviour!= NULL)
delete weaponBehaviour;
將通過 if 語句並刪除無效指針。
您的編譯器還應該警告您(如果您已打開警告)您有一個沒有虛擬析構函數的虛擬 class。 當通過WeaponBehaviour
指針刪除 object 時,這會導致未定義的行為。 WeaponBehaviour
的正確聲明是:
class WeaponBehaviour{
public:
virtual WeaponBehaviour() {}
virtual void useWeapon() = 0;
};
它不會在您的代碼中造成問題(還),但您應該了解三/五的規則。
以上所有問題都可以通過使用std::unique_ptr
來解決,並使您的代碼更簡單、更安全:
#include <iostream>
#include <memory>
class WeaponBehaviour{
public:
virtual ~WeaponBehaviour(){}
virtual void useWeapon() = 0;
};
class SwordBehaviour : public WeaponBehaviour {
public:
void useWeapon()
{
std::cout << "slash slash\n";
}
};
class BowAndArrowBehavior : public WeaponBehaviour {
public:
void useWeapon()
{
std::cout << "suss suss\n";
}
};
class KnifeBehavior : public WeaponBehaviour {
public:
void useWeapon()
{
std::cout << "chak chakk\n";
}
};
class AxeBehavior : public WeaponBehaviour {
public:
void useWeapon()
{
std::cout << "chop chop\n";
}
};
class Character{
protected:
std::unique_ptr<WeaponBehaviour> weaponBehaviour;
public:
void setWeapon(std::unique_ptr<WeaponBehaviour>&& newWeapon)
{
weaponBehaviour = std::move(newWeapon);
}
void fight()
{
weaponBehaviour->useWeapon();
}
};
class King : public Character
{
public:
King(){
setWeapon(std::make_unique<SwordBehaviour>());
}
};
class Queen : public Character
{
public:
Queen(){
setWeapon(std::make_unique<KnifeBehavior>());
}
};
int main() {
King king ;
king.fight();
Queen queen ;
queen.fight();
queen.setWeapon(std::make_unique<AxeBehavior>());
queen.fight();
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.