2015-07-18 2 views
0

Я читаю «Эффективный C++» Скотта Майерса, и теперь я нахожусь в пункте 15, предоставляя доступ к необработанному ресурсу в классах управления ресурсами. Вот пример:Утечка ресурса из объекта RAII

class Font { // RAII class 
public: 
    explicit Font(FontHandle fh) // acquire resource; 
     : f(fh) // use pass-by-value, because the 
    {} // C API does 
    ~Font() { releaseFont(f); } // release resource 
    ... // handle copying (see Item14) 
private: 
    FontHandle f; // the raw font resource 
}; 

Он предложил ввести явную функцию члена преобразования для получения доступа к необработанным ресурса:

class Font { 
public: 
    ... 
    FontHandle get() const { return f; } // explicit conversion function 
    ... 
}; 

Вот что он сказал:

Некоторые программисты может потребовать явного запроса на удаление таких конверсий, чтобы избежать использования класса. То, что в turn, увеличит шансы утечки шрифтов, самое то, что Класс шрифта предназначен для предотвращения.

Я не понял, как предоставление доступа к сырьевому ресурсу увеличивает шансы утечки шрифтов? Мы просто вернули копию исходного указателя на объект ресурса. И мы не должны беспокоиться о доступе к указателю на болтовню, полученному с помощью функции-члена get, потому что оператор delete будет вызываться только в том случае, если мы выйдем из области видимости.

Что я пропустил?

+4

Он говорит, что ** не используя класс ** увеличит вероятность утечки шрифтов. –

+0

«Некоторые программисты могут ... избегать использования класса. Это, в свою очередь, увеличит шансы утечки» –

+0

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что OP неправильно прочитал текст проблемы –

ответ

1

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

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