В моей маленькой программе мне нужно иметь класс с некоторыми динамическими выделенными данными, как это:Исключения безопасности конструктор
class MyClass
{
public:
MyClass(size_t aSize1, size_t aSize2)
:mX1(new char[aSize1]),
mX2(new char[aSize2])
{}
~MyClass()
{
delete[] mX1;
delete[] mX2;
}
...
private:
MyClass(const MyClass& aObj);
MyClass& operator=(const MyClass& aObj);
private:
char* mX1;
char* mX2;
};
Первым вопрос, если я должен использовать сырые указатели, является конструктором мой класс безопасности исключения? Я имею в виду, есть ли какие-либо проблемы в случае, если new
генерирует исключение при распределении памяти для mX2
? В этом случае память, которая уже выделена mX1
, будет протекать или правильно удалена?
Второй вопрос: что будет лучше - использовать какой-либо умный указатель (например, unique_ptr) или использовать stl-контейнер (например, вектор) для хранения динамического массива?
UPD. Если я буду использовать unique_ptr, std::unique_ptr<char[]> mX1;
, как мне реализовать конструктор копирования?
Динамические массивы - это неточность C++, которую вы не должны использовать. Исключения - одна из причин. Другая причина заключается в том, что указатель на первый элемент, который вы возвращаете из 'new []', бесполезен без информации о размере, поэтому вы в конечном итоге сохраняете эту информацию избыточно и не локально. Класс типа 'std :: vector' - это« динамические массивы, сделанные правильно »(если вы не против дополнительного слова для емкости); динамические массивы гораздо лучше выполняются в библиотеке, чем на основном языке. –