我有一个动态的对象数组,我调整了大小。调整大小后,我可以调用int和double对象的set方法,但不能调用任何带有字符串对象的setter。无论何时我尝试在调整大小的数组中为新索引调用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库。 谢谢,
答案 0 :(得分:5)
数组索引从0
到N - 1
运行,所以:
accounts[newSize].setAccountNum(acctNum);
//^^^^^^^^^
正在访问一个超过数组末尾的行为,导致未定义的行为。因此,accounts
的有效索引为0
到newSize - 1
。
由于std::vector
不被允许,我不会提及它。完全没有。
答案 1 :(得分:0)
C ++使用基于0的数组。这意味着当您分配大小为10
的数组时,第一个元素位于索引0
,最后一个元素位于索引9
。在这种情况下,您将分配一个大小为newSize
的数组,然后访问newSize
元素。这不是数组的一部分,因为最后一个元素是newSize - 1
。这就是你遇到崩溃的原因。