0

サイズを変更したオブジェクトの動的配列があります。サイズ変更後、int および double オブジェクトの set メソッドを呼び出すことができますが、string オブジェクトの setter を呼び出すことはできません。サイズ変更された配列で新しいインデックスのセッターを呼び出そうとすると、コア ダンプが発生します。

これは、エラーを生成しているコードの主要部分です。

void resizeAccounts(int newSize, Account *accounts, int acctNum, std::string fName,     :string lName, std::string acctP, double balance)
{       
Account* newArr = new Account[newSize];

for (int i=0; i<newSize-1; i++)
    newArr[i]=accounts[i];

delete [] accounts;
accounts = newArr;
accounts[newSize].setAccountNum(acctNum);
accounts[newSize].setFirstName(fName);
accounts[newSize].setLastName(lName);
accounts[newSize].setAccountPassword(acctP);
accounts[newSize].setBalance(balance);

for(int i=0; i<newSize; i++)
    std::cout << accounts[i].getAccountNum() << std::endl;

私が使っているセッター

void Account::setFirstName( std::string fName) 
{ firstName = fName; }
void Account::setLastName( std::string lName )
{ lastName = lName; }
void Account::setAccountPassword( std::string acctPass)
{ accountPassword = acctPass; }
void Account::setAccountNum( int acctNum)
{ accountNum = acctNum; }
void Account::setBalance( double bal)
{ balance = bal; }`

これは宿題であり、ベクターやほとんどの STL ライブラリを使用することは許可されていません。ありがとう、

4

2 に答える 2

5

配列インデックスは次のように実行され0ますN - 1

accounts[newSize].setAccountNum(acctNum);
      //^^^^^^^^^

配列の末尾を超えてアクセスしているため、未定義の動作が発生します。accountsしたがって、の有効なインデックスは0tonewSize - 1です。

std::vector許可されていないので、言及しません。まったく。

于 2013-02-28T22:16:34.410 に答える
0

C++ は 0 ベースの配列を使用します。これは、サイズ10の配列を割り当てると、最初の要素が index0にあり、最後の要素がindex にあることを意味します9。この場合、サイズの配列を割り当ててから要素newSizeにアクセスしていnewSizeます。最後の要素が であるため、これは配列の一部ではありませんnewSize - 1。これがクラッシュする理由です。

于 2013-02-28T22:18:13.853 に答える