На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> delete и delete [] , В чем разница?
    Hi everybody! :D

    Пиплз, объясните мне пожалуйста в чем разница между delete и delete []...?
    Почему при удалении объекта delete [] вылетает "даже имени не спросив"?

    Да совсем забыл, как определить проинициализирован ли объект?
    Сообщение отредактировано: Unknown_Error -
      Цитата Unknown_Error, 26.11.04, 06:59
      Пиплз, объясните мне пожалуйста в чем разница между delete и delete []...?
      delete[] обычно используется для удаления динам. массива, а не одиночного объекта. Для массивов типов, у которых нет деструкторов, можно использовать и delete, хотя это - моветон. Если же у типа есть деструктор, то использовать delete для массива таких объектов нельзя - деструктор будет вызван только для 0-ого элемента.

      Цитата Unknown_Error, 26.11.04, 06:59
      Почему при удалении объекта delete [] вылетает "даже имени не спросив"?
      А это уже надо в код глянуть

      Цитата Unknown_Error, 26.11.04, 06:59
      Да совсем забыл, как определить проинициализирован ли объект?
      Проверить, что его значение равно значению инициализации... Или что имелось ввиду?
        Вообще по стандарту, если применить delete к массиву, - undefined behavior:
        Цитата

        In the first alternative (delete object), the value of the operand of delete shall be a pointer to a non-array object created by a new-expression, or a pointer to a sub-object representing a base class of such an object. If not, the behavior is undefined.

        Чаще всего это UB выражается невызовом деструкторов для всех элементов массива.
          Цитата Adil, 26.11.04, 06:50
          Проверить, что его значение равно значению инициализации... Или что имелось ввиду?


          Да вот только я хотел сделать следующую штуку

          ExpandedWrap disabled
            TMy::~TMy()
            {
               ...
               this = NULL; // Ругается!
            }


          Как сделать, чтобы при удалении объекта, его указатель становился равным NULL?
          Сообщение отредактировано: Unknown_Error -
            Его указатель или указатель на него? Второе будет выполнено автоматически, если удаляешь как
            delete (одного указателя) или delete [] (целого массива). Если первое, то можешь сделать delete this, но это в общем то, не нужно. Если у тебя объект НЕ используется как указатель, то указатель на this будет автоматически удалён после действий деструктора. Если не доверяешь - можешь это прописать явно.
              TMy *my_variable = new TMy;

              delete my_variable, my_variable = NULL;
                Цитата Sazabis, 26.11.04, 12:40
                TMy *my_variable = new TMy;

                delete my_variable, my_variable = NULL;


                Так то оно так, так как не может быть иначе! :lol:
                Но вся трабла заключается в том, что у меня указателей несколько, и какой именно вызвал этот метод мне незвестен.
                  Не понял?..

                  Цитата

                  Но вся трабла заключается в том, что у меня указателей несколько, и какой именно вызвал этот метод мне незвестен.


                  ?
                  Они у тебя разных типов что ли? Не совсем понятна причина траблы.. код то твой?
                    после delete my_variable
                    вызовется
                    TMy::~TMy()
                    {
                    ...
                    // this = NULL; // Ругается!
                    // this == my_variable!!, та что выше была delete
                    }
                      Цитата Unknown_Error @ 26.11.04, 15:35
                      Как сделать, чтобы при удалении объекта, его указатель становился равным NULL?

                      Не понятно, а для чего тебе это? :huh:

                      Добавлено
                      Просто если у тебя есть указатель на класс TMy в каком либо другом классе, например в CClass,
                      то в CClass и присваивай данному указателю NULL...

                      Добавлено
                      Блин, тебе что нужно сделать подсчет ссылок?
                      А именно следить за количеством указателей, ссылающихся на обьект,
                      и когда счетчик становится равным 0, объект удаляется.

                      Или если я не правильно понял, то обьясни подробней, что тебе нужно???
                        Ок...
                        Объясняю по нормальному

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

                        Цитата
                        Они у тебя разных типов что ли? Не совсем понятна причина траблы.. код то твой?


                        Если бы они были разных типов, то я не думаю, что они бы могли (ну по крайней мере все) вызвать метод данного объекта...

                        Тьфу ты, да точно извиняюсь я свой пост тот, что выше неправильно изложил...
                        Сообщение отредактировано: Unknown_Error -
                          В С++ этого не нужно делать!
                          Так как обькт создается при вызове конструктора, а убивается при вызове деструктора.
                          Если тебе прям необходимо очистить обьект, до конца модуля, вызови деструктор для данного обьекта и все...
                            хорошо, что произойдет если я сделаю так

                            ExpandedWrap disabled
                              delete MyObj;
                              delete MyObj;
                              На втором delete программа тебе скажет #$%%$&&^!@#... :)
                                Неизвестно что может произойти, малоли что там по указателю после первого delete. За частую будешь ловить exception.
                                делай delete MyObj, MyObj = NULL;
                                тогда второй delete MyObj не должен сработать по стандарту. Для полной уверенности можешь писать так
                                ExpandedWrap disabled
                                  if( MyObj )delete MyObj, MyObj = NULL;
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0607 ]   [ 16 queries used ]   [ Generated: 18.08.25, 03:39 GMT ]