2015-03-07 2 views
0

В моей маленькой программе мне нужно иметь класс с некоторыми динамическими выделенными данными, как это:Исключения безопасности конструктор

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;, как мне реализовать конструктор копирования?

+2

Динамические массивы - это неточность C++, которую вы не должны использовать. Исключения - одна из причин. Другая причина заключается в том, что указатель на первый элемент, который вы возвращаете из 'new []', бесполезен без информации о размере, поэтому вы в конечном итоге сохраняете эту информацию избыточно и не локально. Класс типа 'std :: vector' - это« динамические массивы, сделанные правильно »(если вы не против дополнительного слова для емкости); динамические массивы гораздо лучше выполняются в библиотеке, чем на основном языке. –

ответ

1
  1. Это хорошая идея для обработки исключений в конструкторах. Но когда у вас закончилась память, вы поднялись на определенный ручей без определенного инструмента. Ты мало что можешь сделать.
  2. Используйте умные указатели/векторы и т. Д. Вызывает хлопот из жизни.
+1

Я бы поспорил, что идиома (о ручье и инструменте) довольно запутанна для не-родного английского говорящего (что, я думаю, ОП), особенно то, как вы его запутали. –

Смежные вопросы