Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа оператора delete[] 
:(
    Опции темы
Earnest
Дата 11.5.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Vyacheslav @  10.5.2007,  14:44 Найти цитируемый пост)
Забыть можно все что угодно

Забыть - это только одна сторона проблемы. Согласна, не забывай и все будет хорошо. Но ты ловко обошел более важную часть: что делать там, куда ручки програмиста просто не дотянутся, например, повторю, при применении алгоритмов типа revove_if. Там хорошая память не спасет.
Кроме того, если мы беремся корректировать чужой код, про это надо еще и узнать как-то.

Цитата(Vyacheslav @  10.5.2007,  14:44 Найти цитируемый пост)
И  какже быть с циклом разработки. в который неотъемлимой частью входит тестирование? 

Ну хорошо, насчет пользователей я погорячилась, но тестеры тоже люди... Да и самого программиста жалко (в смысле, его зарплату, которая платится за то время, пока он ищет дурацкие ошибки, которых могло бы и не быть).

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

Цитата(Vyacheslav @  10.5.2007,  14:44 Найти цитируемый пост)
но и там я ни разу не встречал рекомендации обязателной замен пары new/delete smart pointer'ами.

Этот аргумент не кажется мне, мягко говоря, убедительным. Разве это означает, что эта практика плоха? 

И в чем, в конце концов, проблема? Ну пусть конкретный программист пока не знает о RAII. Ну так я расскажу и покажу. А потом попрошу переписать его код. Если код изначально хорош, это совсем нетрудно. 


--------------------
...
PM   Вверх
Vyacheslav
Дата 12.5.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Earnest @  11.5.2007,  17:27 Найти цитируемый пост)
Но ты ловко обошел более важную часть: что делать там, куда ручки програмиста просто не дотянутся, например, повторю, при применении алгоритмов типа revove_if. Там хорошая память не спасет.


Но Вы тоже ловко обошли  вопрос: ведь не всегда легко можно заменить указатели на сами объекты smile. Вы думаете , я  испытаю настолько большие затруднения remove_if? А мне кажется, что выкручусь весьма элементарно smile   Предикат мне все равно нужно будет написать, так что я просто добавлю в предикат инструкцию delete и воспользуюсь вместо связки erase/remove_if связкой  erase/copy_remove_if
примерно так
Код

#include <vector>
#include <algorithm>
#include <iostream>
struct Class {
    Class(){
                    static int count = 0;
        number_ = ++count;
        buffer_ = new char[count];
    }
    ~Class(){ 
        delete[] buffer_;
        std::cout << "delete Class with number:" << number_ << std::endl;
    }
    int number_;
    char* buffer_;
};

bool removeOdd (Class* pClass ){
    return pClass->number_ % 2 ? delete pClass, true: false;
};

std::ostream& operator<<( std::ostream& out, Class* pClass ) {
    return out << pClass->number_;
}

void destroyClass(Class *pClass) {
    delete pClass;
}

using namespace std;
int main(int argc, char* argv[])
{
    vector<Class*> v;
    for( int i = 10; i--;) {
        v.push_back(new Class);
    }
    cout << "Vector size:" << v.size() << endl; 
    copy(v.begin(),v.end(), ostream_iterator<Class*, char>(cout," "));
    cout << endl << "remove and destroy all Class instance with odd number" << endl;
    //---------------------------------------------------------------------------------------------
    v.erase(remove_copy_if(v.begin(), v.end(), v.begin(), removeOdd ), v.end());
    //----------------------------------------------------------------------------------------------
    cout << "Vector size:" << v.size() << endl; 
    cout << "remained Class instances with number:"; 
    copy(v.begin(),v.end(), ostream_iterator<Class*, char>(cout," "));
    cout << endl << "destroy remained Class instances" << endl;
    for_each(v.begin(), v.end(), destroyClass );
    return 0;
}

Надеюсь данный пример достаточно презентативен  smile

Цитата(Earnest @  11.5.2007,  17:27 Найти цитируемый пост)
Конечно, структурировать код можно хорошо и без умных примочек, только усилий нужно приложить больше. А, спрашивается, ради чего? Если есть известные способы избежать лишних траблов?

Вы все меня стараетесь убедить, что эти "умные примочки" благо? Это напрасный труд smile Я не ретроград, и сам с Вами полностью согласен. Очень полезны и если я не скажу, что часто использую "умные указатели" , то уж "строгие указатели"  и гарды ( guard ) использую постоянно, но  только вопрос этого диспута не в том, хорошо это или плохо . О том , в чем я не соглашусь, читайте ниже
Цитата(Earnest @  11.5.2007,  17:27 Найти цитируемый пост)
Этот аргумент не кажется мне, мягко говоря, убедительным. Разве это означает, что эта практика плоха? 

Мне кажется я уперся в стену  smile .  Я говорил, что это практика плоха? Я  говорил, что это не панацея от кривых рук и совет использовать smart pointer'ы , вместо того, чтобы помочь разобраться, где ошибка - порочен. Не говоря уже об объявлении "ненадежными" new, delete, vector на том основании. что они в состоянии делать то, для чего не предназначены: а именно, думать за программиста. 

Цитата(Earnest @  11.5.2007,  17:27 Найти цитируемый пост)
И в чем, в конце концов, проблема? Ну пусть конкретный программист пока не знает о RAII. Ну так я расскажу и покажу. А потом попрошу переписать его код. Если код изначально хорош, это совсем нетрудно.  

Да проблемы нет. Но если код "изначально хорош", чего его трогать. А рассказать и показать можно. А насчет переписать, не знаю. Если код удовлетворяет требуемому уровню безопасности и не имеет дефектов, то смысл его переписывать? Не лучше ли дать следущее задание, в котором  он сможет применить полученные знания. 




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Earnest
Дата 13.5.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Vyacheslav @  12.5.2007,  20:10 Найти цитируемый пост)
Я говорил, что это практика плоха? Я  говорил, что это не панацея от кривых рук и совет использовать smart pointer'ы , вместо того, чтобы помочь разобраться, где ошибка - порочен.

ОК, значит мы во всем согласны. От кривых рук или ошибки в ДНК это действительно не спасает.
Насчет помочь разобраться... В принципе, конечно, правильно ты говоришь, но только теоретически. Некоторый начальный уровень должен быть достигнут самостоятельно, иначе на что это программист годится? А многие  начинающие программисты нынче так обленились со всеми этими супер-средами, где все "само" делается, что все им в рот положи, да и  разжуй еще, а они только стонут - ох, как неудобно и непонятно.... Поэтому и возникают отписки типа - используй STL и т.д.



--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0836 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.