[英]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];
}
你剛剛將這些指針復制到你新的,稍微大一點的數組。 如果刪除它們指向的對象,則新陣列中充滿了無法使用的懸空指針。
最近的修復是:
或者,如果您確實要刪除原件,則需要先復制它們 - 這意味着對象的深層副本而不是指針的淺層副本,因此您的新數組應該像
// 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.