在类中声明的对象的指针数组?

时间:2014-01-05 20:37:32

标签: c++ arrays pointers

所以我的问题是:我想知道如何删除(帐户指针数组),以便我可以用我的dummyA数组的内容填充数组。我尝试使用for循环delete[]delete accounts[j],但无济于事我不断收到错误:_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));老实说,我不知道这意味着什么.. 经过研究,我最好的猜测是我的问题是我不止一次删除我的数组但我不知道如何..实际上,我的帐户指向新对象的数组在数组中间有一个无关的对象,soooo我制作了一个假人来放置所有相关的对象,目的是删除帐户中的所有对象,然后用虚拟内部的对象替换对象,我想节省内存并尝试高效..任何Takers ??
        //头文件
     ifndef H_ChartOfAccounts
    定义H_ChartOfAccounts
    包含字符串
    使用命名空间std;

const int size = 100;


class cOfA
{
protected:
int actNumber;
string actName;
int actType;
static cOfA* accounts[size];<Dynamic Array of Pointers to Object "In Question"
static int totalAccounts;

public:
cOfA();
virtual ~cOfA();
void getAccount();
static void createAccount();
static void addAccount();
static void delAccount();
static void displayAccount();
void saveAccount();
};

**endif**
//>Implementation File For Above Header File
void cOfA :: delAccount()
{
int searchItem;
char ch;

cout<<"\nEnter the Account Number that you want to delete: ";
cin>>searchItem;

for ( int j = 0; j < totalAccounts; j++ )
{
    if ( accounts[j]->actNumber == searchItem )
    {
        cout<<"\nDo you want to delete this account: \n";
        cout<< accounts[j]->actName<<" / ";
        cout<< accounts[j]->actNumber<<" / ";
        cout<< accounts[j]->actType<<endl;
        cin>>ch;

        if(ch == 'y')
        {
            accounts[j]->actName = " ";
            accounts[j]->actNumber = 0;
            accounts[j]->actType = 0;
            totalAccounts--;
            break;
        }
        else
        {
            cout<<"\nEnter the Account Number you want to delete: ";
            cin>>searchItem;
        }
    }//end if
}// for loop

cOfA* dummyA[size];
int l = 0;

    for ( int k = 0;k < totalAccounts+1; k++ )
    {
        if( accounts[k]->actNumber != 0 )
        {
            dummyA[l] = new cOfA;
           *dummyA[l] = *accounts[k];
           l++;
        }

    }//end for loop


delete[] accounts;//<--"When I compile, I get My Error Here"

//Break Statement:"  _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); "


int j = 0;
while ( j < totalAccounts )
{
    accounts[j] = new cOfA;
    *accounts[j] = *dummyA[j];
    j++;
}//end while loop
delete[] dummyA;


}

2 个答案:

答案 0 :(得分:0)

在评论中你说accounts是:

static cOfA* accounts[size];

那么你根本不应该delete[],因为它没有动态分配。

您必须仅对delete[] d。

的内容使用new[]

说到这一点,我没有看到那些指针元素的<{1}}语句

一般情况下,我会尝试摆脱指针用法的所有,因为对我来说这看起来并不合适。

答案 1 :(得分:0)

因此,此代码有2个问题导致错误。 1:静态变量的基本规则状态:您不能声明并将值放入您声明它的类中的静态变量中。我声明了静态变量帐户数组并将值放入数组中称为尺寸。 2:我浅浅地将一个指针数组复制到另一个指针数组中,所以当我删除帐户时,我也删除了 dummyA 。相反,我可以使用复制构造函数并在类外部声明一个指针数组,或者使用指针指针方法对指针数组进行排序。这些是我发现有用的解决方案。我选择使用指向指针函数的指针来对我的数组进行排序并节省内存,现在我可以在需要时使用delete而不再有错误。

  int j;
int k;

for ( j = 0; j < totalAccounts ; j++ )
{
    for ( k = j + 1; k < totalAccounts; k++ )
    {
        if ( accounts[j] == NULL )
            accounts[j] = accounts[k];
        if ( accounts[k] == NULL )
            continue;
        order ( accounts + j, accounts + k );
    }
}

}
//////////////////////////////////////////////////////////////////////////
void cOfA :: order ( cOfA** pp1, cOfA** pp2 )
{
if ( (pp1) == NULL )
    return;
if ( (pp2) == NULL )
    return;
if ( (*pp1)->actNumber > (*pp2)->actNumber )
{
    cOfA* temp = *pp1;
    *pp1 = *pp2;
    *pp2 = temp;
}

}