我有一些问题要解除我所拥有的类的数组。下面是Class,一个简化的实现,以及我试图用来关闭它的代码。
角色类
#include <cstdlib>
class Character
{
private:
bool human;
int Xposition; // the character's postion on the board.
int Yposition; // the character's postion on the board.
bool alive;
public:
Character(); //This is my constructor
~Character(); //This is my destructor
bool isHuman(); //return whether type 1 aka Human
bool isZombie(); //return whether type 2 aka Zombie
void setHuman(); //set to type 1 or Human
void setZombie(); //set to type 2 or Zombie
void setPos(int xpos, int ypos); //set the board position
int X();
int Y();
bool isAlive(); //checks to see if a Human is still alive and to be displayed
bool Dead(); //kills the character and sets alive to false
int num_moves_allowed; //number of moves allowed.
};
分配代码:
Character *characters[11];
int human_count = 0;
for(int i=0; i<12; i++)
{
characters[human_count] = new Character();
human_count++;
}
终止代码:
for(i=11;i<=0;i--)
{
if(characters)
{
characters[i]->~Character();
delete characters[i]; characters[i] = NULL;
}
}
if(characters)
{
//ERROR IS HERE
delete [] characters;
}
我在阵列上尝试了许多不同的“删除”命令,我不断收到“Debug Assertion Failed!”窗口。它说来自visual studio vctools的dbgdel.cpp是第52行的问题所在 它还说“表达式:_BLOCK_TYPE_IS_VALID(pHead-&gt; nBlockUse)
有人请帮助我,我确信这很简单。
答案 0 :(得分:10)
我建议你避免一起使用数组。使用字符向量。
将您的矢量声明为
vector<Character> vCharacters;
然后将对象插入
for(int i = 0; i < 100; i++)
vCharacters.push_back(Character());
如果你想存储指向Character对象的指针,那么将它们包装在shared_ptr中,这将为你解除分配它们。
vector<shared_ptr<Character>> vCharacters;
for(int i =0; i < 100; i++)
{
shared_ptr<Character> spCharacter(new Character());
vCharacters.push_back(spCharacter);
}
当C ++可以做到这一点时,避免自己管理内存
答案 1 :(得分:5)
characters
数组已在堆栈上分配,因此您无需删除它。但是,如果您希望数组在本地范围内存活,请使用以下内容创建它:
Character **characters = new Character[11];
然后您的delete[]
行应该可以正常工作。
另请注意,您无需显式调用Character的析构函数:delete
会自动调用它。
答案 2 :(得分:2)
正如obelix所提到的,您应该使用标准模板库中的向量。 但是,如果您决定使用原始数组:
const int MAX_CHARACTERS = 11;
Character *characters[MAX_CHARACTERS];
for(int characterCount = 0; characterCount < MAX_CHARACTERS; ++characterCount)
{
characters[characterCount] = new Character();
}
...
if (characters != NULL)
{
for(int i = 0; i < MAX_CHARACTERS; ++i)
{
delete characters[i];
}
}
Paolo Capriotti是正确的,如果您希望字符超出其范围,则应使用new声明字符:
const int MAX_CHARACTERS = 11;
Character **characters = new Character*[MAX_CHARACTERS];
for(int characterCount = 0; characterCount < MAX_CHARACTERS; ++characterCount)
{
characters[characterCount] = new Character();
}
...
if (characters != NULL)
{
for(int i = 0; i < MAX_CHARACTERS; ++i)
{
delete characters[i];
}
delete [] characters;
}
更好的解决方案是standard vector class:
#include <vector>
...
const int MAX_CHARACTERS = 11;
std::vector<Character> characters;
for (int i = 0; i < MAX_CHARACTERS; ++i)
{
characters.push_back(Character());
}
...
characters.clear();
注意清理有多容易? (在这种情况下,它是可选的,因为当字符被销毁时,它将自动调用它包含的每个项目的析构函数。)
答案 3 :(得分:0)
此外:
Character *characters[11];
应该是
Character *characters[12];
和
for(i=11;i<=0;i--)
应该是
for(i=11;i>=0;i--)
答案 4 :(得分:0)
我意识到这是一个简化的用途,但为什么还要为堆访问烦恼呢?
只需使用
字符[11];
可能同样有效且安全。
的std ::矢量&lt;&GT;很好,但如果列表总是固定大小,并且成员数据中没有卷,为什么不呢?