конструктор со строкой и проверкой bad_alloc - PullRequest
0 голосов
/ 24 июня 2018

Я новичок в C ++, пишу класс на C ++ и использую std::string. Как мне обработать bad_alloc исключение? Могу ли я сделать:

Temp::Temp(const string name) :
{
    try {
        name(name);
    }
    catch(std::bad_alloc& a) {
        cout << "bad alloc error" << endl;
    }
}

или я должен сделать

Temp::Temp(const string name) :
 name(name)
{
    catch(std::bad_alloc& a) {
        cout << "bad alloc error" << endl;
    }
}

Я хочу перехватить исключение, чтобы я мог предотвратить утечку памяти, а затем, возможно, сбросить его снова.
Также, когда я использую x.assaing(y) из std::string, должен ли я также проверять исключение bad_alloc? (Если я хочу справиться с утечками памяти.) Я ищу способ без умных указателей (мы его еще не учили).

Ответы [ 2 ]

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

Инициализация члена типа std::string через конструктор в списке инициализатора члена не приведет к утечке памяти.

#include <string>
struct Temp
{
   Temp (const std::string& name): name(name) {}
   std::string name;
};

Temp t ("yourname");
std::cout << t.name; // yourname

ОБНОВЛЕНИЕ: (предложено @Deduplicator)

Если используется только один ctor, можно также использовать std::string_view, который является:

постоянная непрерывная последовательность char подобных объектов

Как:

#include <string_view>
struct Temp
{
   Temp (std::string_view name): name(name) {}
   std::string name;
};

Temp t ("yourname");
std::cout << t.name; // yourname
0 голосов
/ 24 июня 2018

Если при строковом построении выдается bad_alloc, вы можете сделать очень мало для его восстановления.Вы, конечно, не должны заключать каждую конструкцию строки в блок try.Вместо этого вы должны разрешить исключению подняться на более высокий уровень, например, ваша основная функция, перехватить его там, как-то сообщить об ошибке и, возможно, завершить программу.В общем, вы хотите перехватывать исключения на максимально возможном уровне, чтобы их можно было разумно обработать.

...