释放一个对象数组?

时间:2009-08-28 19:23:10

标签: c++

我有一些问题要解除我所拥有的类的数组。下面是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)

有人请帮助我,我确信这很简单。

5 个答案:

答案 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;很好,但如果列表总是固定大小,并且成员数据中没有卷,为什么不呢?