2014-01-05 102 views
-3

所以我的問題是:我想知道如何刪除(帳戶指針數組),以便我可以用我的dummyA數組的內容重新填充數組。我試着delete[]delete accounts[j]與for循環,但無濟於事我不斷收到錯誤:_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));老實說,我不知道這是什麼意思.. 經研究,我最好的猜測是,我的問題是,我刪除我的數組不止一次,但我不知道如何..實質上,我指向新對象的帳戶數組在數組中間有一個不相關的對象,所以我僞造了一個虛擬對象,將所有相關對象放入到清除的目標中賬戶中的所有對象然後用虛擬內部的對象替換對象,我想節省內存並嘗試高效。
//頭文件
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; 


} 
+0

首先,修理您的縮進。其次,製作一個[testcase](http://sscce.org)。 –

+0

您可以編輯您的帖子,而不是在評論中編寫代碼段。 –

+0

第三次:代碼截斷 –

回答

0

在評論你說accounts是:

static cOfA* accounts[size]; 

那麼你就不應該delete[]荷蘭國際集團它在所有的,因爲它並非是動態分配的。

您只能在上使用new[]'d。

說到這一點,我沒有看到任何delete語句爲那些指針元素

一般來說,我會嘗試擺脫所有您的指針使用情況,因爲它對我來說不是必要的。

+0

謝謝大家對於這個新的反饋以及學習,如果這不是很明顯..大聲笑..我會努力縮進和格式化,因爲我習慣了這個... – user3163375

+0

@ user3163375:下次請在工作之前_before_點擊「提交」。 :)歡迎。 –

+0

我很困惑,'accounts [j]'是一個動態數組嗎?在程序執行過程中會創建一個動態數組。我聲明' * [size];'但是直到我使用「new」創建它時,它才真正分配內存。由於我使用「new」創建,爲什麼不能使用「delete []」來刪除它? – user3163375

0

所以這個代碼有兩個問題是導致錯誤的原因。 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; 
} 

} 
相關問題