2015-09-29 2 views
0

Был задан вопрос о том, что такое класс оболочки C++ , и я думаю, что он дал хороший ответ. Его имя пользователя: GManNickG от переполнения стека при условии, что следующий код с его ответом:C++ new и delete ptr wrapper class

class int_ptr_wrapper 
{ 
public: 
    int_ptr_wrapper(int value = 0) : 
    mInt(new int(value)) 
    {} 

    // note! needs copy-constructor and copy-assignment operator! 

    ~int_ptr_wrapper() 
    { 
     delete mInt; 
    } 

private: 
    int* mInt; 
}; 

Этот код побудило меня с вопросом. Я слышал от нескольких разных людей, что его считают неправильной практикой использовать новые и удалять ключевые слова. Есть ли определенная ситуация, в которой я должен использовать новую или удалить? Также, если я написал код выше, как показано ниже, что считается лучшей практикой?

class int_ptr_wrapper 
{ 
public: 
    int_ptr_wrapper(int value = 0) : 
     m_int(&value) {} 
private: 
    int* m_int; 
}; 
+2

В вашей второй версии 'm_int' является оборванным указателем. 'значение' будет уничтожено в конце блока конструктора. Что касается вашего вопроса, просто посмотрите RAII, который ответит на ваш вопрос о голых новостях и удалит плохое. –

ответ

0

Существует (почти) всегда лучший способ, чем использование new. Существует абсолютно лучший способ, чем использование delete.

Посмотрите документацию для std::shared_ptr<> и std::unique_ptr<>. Между ними они охватывают каждый сценарий, который вам когда-либо понадобится в отношении управления областью памяти, автоматического освобождения ресурсов памяти, автоматического закрытия файлов, автоматического обнуления памяти, используемой для шифрования ... и так далее. Это связано с тем, что оба класса дают вам возможность предоставить пользовательский дебетер, поэтому, независимо от того, насколько сложна ваша задача освобождения памяти, они покрываются безупречно и безопасно.

Написание полного класса диспетчера памяти сложнее, чем кажется на первый взгляд. Стандарт C++ сделал это для вас. Нет никакого аргумента, чтобы изобретать это колесо.

+0

Пока ваш ответ верен, он не объясняет, почему новый или удаленный плохой, поэтому IMHO он неполный. Кто-то может сказать вам, что есть почти всегда лучший способ, чем использовать умные указатели. Не могли бы вы поверить в это мгновенно? – Gizmo

+0

Простите меня. Вопрос не спросил об этом. Я предположил, что ОП понимает последствия, связанные с утечкой ресурсов при непосредственном использовании нового/удаления, но если это не будет радостно обновляться. –