2017-04-06 96 views
0

我想問你如何在C++中重新分配一個struct數組?重新分配一個結構數組

在C中有realloc這是相當不錯的,但不建議在C++中使用它。也許你們中的一些人會告訴我,我不應該使用struct陣列?

那麼,在這個任務我們不能使用任何STL容器,所以struct是唯一的選擇,我想。這是爲實踐的問題與分配,重新分配內存和其他東西...

在下面的示例中,我寫了一個代碼,我將如何使用mallocrealloc在C中執行它。你能給我一個建議如何在C++中做到這一點。

謝謝。

class CCompany 
{ 
    public: 
     CCompany(); 
     bool NewAccount(const char * accountID, int initialBalance); 
     struct ACCOUNT 
     { 
     char *accID; 
     int initialBalance; 
     ... 
     };  
     ACCOUNT* accounts ; 
     ... 
     ...  
    private:  
     int ReallocationStep = 100; 
     int accountCounter = 1; 
     int allocatedAccounts = 100; 
     ... 
} 

CCompany::CCompany() 
{ 
    accounts = (ACCOUNT*)malloc(allocatedItems*sizeof(*accounts)); 
} 


bool CCompany::NewAccount(const char * accountID, int initialBalance) 
{ 
    // Firstly I check if there is already an account in the array of struct. If so, return false. 
    ... 
    // Account is not there, lets check if there is enough memory allocated. 
    if (accountCounter == allocatedAccounts) 
    { 
     allocatedAccounts += ReallocationStep; 
     accounts = (ACCOUNT *) realloc(accounts, allocatedAccounts * sizeof(*accounts)); 
    } 

    // Everything is okay, we can add it to the struct array 
    ACCOUNT account = makeStruct(accID, initialBalance); 
    accounts[CounterAccounts] = account; 

    return true; 
} 
+0

如果你不想使用'realloc',當'new'可用時,你應該重新考慮使用'malloc'。你應該爲更大的尺寸執行'new',複製你已有的內容,然後'delete []'。還要非常小心你的'CCompany'類正在接受字符串的指針並將它們存儲爲非擁有的(即不需要拷貝)。 –

+0

是的,當然,而不是malloc我會使用新的,但我不確定與realloc。 –

+0

如果在C++中有一個realloc相當於它會殺死它的蹤跡中的異常安全。分配新內存後,您希望舊數據仍然存在。分配可能會導致代碼處於不一致狀態。你應該分配新的塊,一旦你知道成功了,然後複製到新塊中,然後刪除舊塊。 –

回答

0

如果你沒有可能使用STL容器,也許你應該考慮使用某種列表而不是數組。根據你的代碼,這可能會比重複分配內存更好的解決方案。

+0

我們不能使用列表或向量,否則我會 –

+0

@TheDoctorBombastic,我不是在談論STL列表。您可以編寫自己的代碼並添加必要的函數來迭代它,添加,計數和刪除元素。 – Rapid

+0

當然可以:-)我可以開發一個新系統,併成爲世界上最富有的人 - 無論如何,我正在學習它。我在學習的第一年,我無法做類似於創建我自己的列表的事情:-)我一直在用C++編程1.5個月...... :) –

0

個人而言,我不認爲realloc不是在C++中建議,但對於mallocreallocfree有C++中的其他概念(如新,佈局新,刪除,...),移多種用途語義更多地在「對象」上而不是「普通內存」上。

因此,使用realloc的方法仍然有效,而且 - 如果像鏈表這樣的動態數據結構不是一種選擇 - 實際上我能想到的最好,因爲它可以避免不必要的複製,刪除,重複創建項目,同時仍然提供連續的內存塊對象。

0

根據其他問題的答案+(12),應避免在C++使用mallocrealloc在可能的情況。

這兩個參考文獻的後者提供了一個很好的建議:如果由於它是一個STL容器而不允許使用std::vector,可能std::fstream也許值得考慮作爲替代方案。這表明,依靠過量工作記憶來處理文件而沒有可能是評估任務的預期目標。我看不到分配標準,所以我不能說這是否合規。

即使有您的一個任務標準,一些講師喜歡改變需求,很少或根本沒有通知;實際上,有時只是看到一個解決方案,而不是他們想要的任務(不公平)提示這樣的修改。任何評估都會促使你重新創造std::vector對我來說似乎很愚蠢,但如果你有兩種選擇,並且只有其中一項涉及留在你的學位,我認爲你唯一的解決方案是使用realloc;這裏不需要malloc

爲了減少調用realloc經常(由另一個答案指出),你可以刪除兩個你的三個櫃檯,呼叫realloc當剩餘計數器即將成爲兩個電源,並重新分配由的開銷兩個因素像我在做push_back

void *push_back(void **base, void const *value, size_t *nelem, size_t size) { 
    typedef unsigned char array[size]; 
    array *b = *base; 
    if (SIZE_MAX/sizeof *b <= *nelem) { 
     return NULL; 
    } 

    if (*nelem & -~*nelem ? 0 : 1) { 
     b = realloc(b, (*nelem * 2 + 1) * sizeof *b); 
     if (!b) { 
      return NULL; 
     } 
     *base = b; 
    } 

    b += (*nelem)++; 
    return value 
     ? memmove(b, value, sizeof *b) 
     : b; 
} 
0

正確的C++的方法是使用一個std::vector可與再分配處理很好。當你的任務不允許你使用標準集裝箱,您可以:

  • 或者使用新建立一個自定義的容器和刪除的重新分配和基於數組或一個鏈表
  • 或直接使用數組和堅持新的和刪除重新分配 - 仍然可以接受的C++
  • 或恢復到C++標準庫中包含的C++標準庫中的舊版本mallocrealloc。但是你必須意識到這不會初始化結構。

因爲malloc/realloc不會調用構造函數,所以最後一種方法必須被看作是低級別的優化,並且不應該明確記錄無初始化。