У меня есть динамический массив объектов, размер которого я изменил. После изменения размера я могу вызывать методы set для объектов int и double, но не для любого метода установки с строковыми объектами. Каждый раз, когда я пытаюсь вызвать установщик для нового индекса в массиве с измененным размером, я получаю дамп ядра.
Это основная часть кода, которая генерирует ошибку.
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
в N - 1
так вот:
accounts[newSize].setAccountNum(acctNum);
//^^^^^^^^^
обращается к одному за концом массива, вызывая неопределенное поведение. Действительные индексы для accounts
следовательно является 0
в newSize - 1
,
Как std::vector
не разрешено, я не буду упоминать это. Совсем.
C ++ использует 0 основанные массивы. Это означает, что когда вы выделяете массив размера 10
первый элемент по индексу 0
и последний элемент находится в индексе 9
, В этом случае вы выделяете массив размера newSize
а затем доступ к newSize
элемент. Это не часть вашего массива, так как последний элемент newSize - 1
, Вот почему вы получаете сбой.