Выдача исключения из утечки памяти конструктора - PullRequest
0 голосов
/ 08 июня 2018

В этом коде, если предложение if истинно, из конструктора CurrentAccount выдается исключение:

void Bank::createAccount(string accountType,int iban,int ownerid,double amount)
{
    Account* toAddAccount=nullptr;
    if(accountType=="CurrentAccount")
    {
        toAddAccount=new CurrentAccount(iban,ownerid,amount);
    }
}

Как видите, исключение не перехватывается в этом методе,но повышается в стеке.

Мне было интересно, будет ли утечка памяти, поскольку я не удаляю toAddAccount (конструктор CurrentAccount работает только с целыми числами)?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Я думаю, что на этот вопрос уже был дан ответ, но вы должны использовать RAII при построении ваших объектов.В частности (как уже указывалось несколько раз) используется std::unique_ptrmake_unique в зависимости от вашего стандарта).

Account* Bank::createAccount(string accountType,int iban,int ownerid,double amount)
{
    std::unique_ptr<Account> toAddAccount;
    if(accountType=="CurrentAccount")
    {
        toAddAccount=new CurrentAccount(iban,ownerid,amount);
    }

    // presumably more code

    return toAddAccount.release(); // your factories shouldn't care where your accounts are stored.
}
0 голосов
/ 08 июня 2018

Это не утечка, потому что «новое выражение» отвечает за очистку, если во время его выполнения выдается исключение.Другими словами, «новое выражение» выделяет память и затем вызывает конструктор CurrentAccount.Если этот конструктор выдает «новое выражение», автоматически освобождается ранее выделенная память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...