簡體   English   中英

如何在C ++中擴展動態分配的數組?

[英]How to expand dynamically allocated array in C++?

當用戶在main中輸入新數據時,我試圖實現數組動態擴展的解決方案,如下所示:

ComplexNumber** nizKompl = new ComplexNumber*[1];
bool unos = true;

while(unos){
  cout << "Unesite novi kompleksni broj(realni imaginarni): ";

  if(cin >> re >> im){ 
    nizKompl[brojUnesenih] = new ComplexNumber(re,im);
    ++brojUnesenih;

    ComplexNumber** nizTemp = new ComplexNumber*[brojUnesenih+1];
    copy(nizKompl, nizKompl+brojUnesenih, nizTemp);

    for(int i=0; i<brojUnesenih; ++i){
      delete nizKompl[i];
    }

    delete [] nizKompl;
    nizKompl = nizTemp; 
  } else {
    cout << endl << endl;
    unos = false;
  }
}

ComplexNumber是自定義類型。 ComplexNumber工作正常但我遇到雙重免費或損壞錯誤的問題,因為我正在輸入新數據並在程序中創建新的ComplexNumbers。

有沒有更好的方法來實現這一目標? 我需要使用自己的動態數組而不是std :: vector,因為它是出於教育目的。

據我所知,當您嘗試釋放已經免費的內存時,會發生雙重自由錯誤。 但似乎我無法解決這個問題,因為我看不到雙重自由應該發生。

記憶中發生的事情我不知道嗎? 這是std :: copy的問題,因為我正在復制指針指針數組?

我真的很感激任何幫助或建議。 謝謝!

如果你真的不需要使用std::vector (出於教育原因),那么你的問題就在這里:

for(int i=0; i<brojUnesenih; ++i){
  delete nizKompl[i];
}

你剛剛將這些指針復制到你新的,稍微大一點的數組。 如果刪除它們指向的對象,則新陣列中充滿了無法使用的懸空指針。

最近的修復是:

  1. 只是不要刪除這些對象。 考慮轉移到新陣列的所有權並使其保持活力。 刪除上面引用的三行。
  2. 或者,如果您確實要刪除原件,則需要先復制它們 - 這意味着對象的深層副本而不是指針的淺層副本,因此您的新數組應該像

     // shallow copy: // copy(nizKompl, nizKompl+brojUnesenih, nizTemp); // deep copy: transform(nizKompl, nizKompl+brojUnesenih, nizTemp, clone); 

    與功能

     ComplexNumber* clone(ComplexNumber *original) { return new ComplexNumber(*original); } 

    NB。 我想不出有任何理由這樣做,這只是浪費。

使用std::vector<ComplexNumber>並使用push_back動態分配內存。

您的代碼看起來像這樣:

std::vector<ComplexNumber> nizKompl;

while(true) {
  cout << "Unesite novi kompleksni broj(realni imaginarni): ";

  if(cin >> re >> im){
    nizKompl.push_back({re,im});
  } else {
    cout << endl << endl;
    break;
  }
}

如前所述,使用std::vector將是正確的方法。

但是你的確切問題是:

for(int i=0; i<brojUnesenih; ++i){
    delete nizKompl[i];
}

這是導致雙重刪除的原因,因為您將相同的指針復制到新數組並刪除它們。 輸入第一個數字時,您將創建一個大小為1的數組並創建一個對象。 在第二個數字上,您將分配一個大小為2的新數組,將第一個元素復制到新數組,但也刪除它。 一旦你添加第三個元素,你將創建一個大小為3的新數組,復制前兩個指針並再次嘗試刪除它們,但第一個指針已被刪除。

目前還不清楚為什么你不使用標准類std::vector並使用指針代替對象本身。

然而,似乎你的意思是如下

#include <iostream>
#include <algorithm>
#include <memory>

struct ComplexNumber
{
    ComplexNumber() : ComplexNumber( 0, 0 ) {}
    ComplexNumber( int re, int im ) : re( re ), im( im ) {}
    int re;
    int im;
};

int main() 
{
    ComplexNumber **nizKompl = nullptr;
    size_t brojUnesenih = 0;
    bool unos;

    do
    {
        std::cout << "Unesite novi kompleksni broj(realni imaginarni): ";

        int re, im;

        if( ( unos = !!( std::cin >> re >> im ) ) )
        { 
            ComplexNumber **nizTemp = new ComplexNumber * [brojUnesenih + 1];

            std::copy( nizKompl, nizKompl + brojUnesenih, nizTemp );
            nizTemp[brojUnesenih] = new ComplexNumber( re, im );

            ++brojUnesenih;

            delete [] nizKompl;
            nizKompl = nizTemp;
        }
    } while ( unos );

    for ( size_t i = 0; i < brojUnesenih; i++ )
    {
        std::cout << "{ " << nizKompl[i]->re 
                  << ", " << nizKompl[i]->im
                  << " } ";
    }
    std::cout << std::endl;

    if ( nizKompl )
    {
        std::for_each( nizKompl, nizKompl + brojUnesenih, std::default_delete<ComplexNumber>() );
    }

    delete [] nizKompl;

    return 0;
}   

程序輸出可能看起來像

Unesite novi kompleksni broj(realni imaginarni): 1 1
Unesite novi kompleksni broj(realni imaginarni): 2 2
Unesite novi kompleksni broj(realni imaginarni): 3 3
Unesite novi kompleksni broj(realni imaginarni): 4 4
Unesite novi kompleksni broj(realni imaginarni): 5 5
Unesite novi kompleksni broj(realni imaginarni): a
{ 1, 1 } { 2, 2 } { 3, 3 } { 4, 4 } { 5, 5 } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM