Пункт 28 Эффективного С++ говорит avoid returning "handles" to object internals
. Этот вопрос показывает, как разработать код сделать именно это, думая об инкапсуляции, чтобы избежать случайного раскрытия внутренностей вашего класса.
В моем примере используется массив данных, и, поскольку проблема с памятью, я бы не хотел использовать std::vector
(и библиотеку Boost).
Использование массива здесь очень упрощенная версия моего кода:
class Foo {
public:
Foo(int size) : data_(new int[size]) {
// Populate with data just for the example
for(int i = 0; i < size; i++) {
data_[i] = i;
}
}
// I know that this isn't good practice
int* const get_data() const {
return data_;
}
~Foo() {
delete[] data_;
}
private:
int* data_;
};
int main(void) {
Foo* foo = new Foo(10);
int* const data = foo->get_data();
delete foo;
// data now dangles which is bad!
return 0;
}
Я понимаю, что использование const
с get_data()
не делает его безопасным. Если бы я использовал вектор, я мог бы скопировать его, как в примере выше, но, поскольку я хотел бы избежать этого, мне было интересно, как лучше всего спроектировать мой класс, чтобы избежать этой потенциально опасной ситуации?
std::vector
имеет очень мало накладных расходов по сравнению с необработанным массивом и намного безопаснее и проще в использовании. - person Angew is no longer proud of SO   schedule 15.04.2013vector
в любых случаях, за исключением того, что вы точно (!!!) уверены, что он будет действовать хуже, чем другой контейнер - person borisbn   schedule 15.04.2013