Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 15.05.2014, 09:49   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 03.09.2005
Сообщений: 14,014
Написано 6,795 полезных сообщений
(для 20,916 пользователей)
delete [] const char

Меня всё устраивает, я ко всему привык, я это знаю. НО. Не кажется ли вам это слегка нелогичным?
Ну почему, почему одновременно:
1) нельзя менять данные, адресуемые указателем const char *
2) можно высвободить память, адресуемую указателем const char *
    const char *n=new char[10];
    n[0]=0; // НЕЛЬЗЯ
    delete[]n;//МОЖНО
Типа снёс к чертям кусок памяти - это ничего страшного, это же не изменение данных. Можно возразить, что оператор delete формально применяется не к данным, а к самому указателю на них. Но ведь
const char * const n=new char[10];
тоже можно удалить.
Выходит бажного деструктор пофиксит действует ещё одно правило: разрешается высвободить память с любым спецификаторм доступа.
Отличный способ выстрелить себе в ногу, попробовав удалить константную строку.
    const char * const n="222";
    cout<<n<<endl;
    delete[]n;
И хоть приведённая конструкция на GCC не взывала сбоя, в 5.2.2. ("Язык программирования C++" Страуструпа) конструкции типа
    char *n="111";
    n[2]=0;
сопровождаются отметкой о неопределённости результата.

Кстати, пользуясь случаем, хочу провести мини-тест используемых компиляторов. Сообщите результат выполнения кода
const char *p="111";
    const char *q="111";
    if(p==q){
        cout<<"eq"<<endl;
    }
    else{
        cout<<"!eq"<<endl;
    }
и используемый компилятор (на всякий случай и IDE; опционально - флаги компиляции, режим сборки).
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 15.05.2014, 10:56   #2
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,920
Написано 3,410 полезных сообщений
(для 9,318 пользователей)
Ответ: delete [] const char

Xcode 5.1.1, Apple LLVM 5.1, opt. flags: -O0
result: eq
__________________
(Offline)
 
Ответить с цитированием
Старый 15.05.2014, 12:03   #3
HolyDel
 
Регистрация: 25.09.2006
Сообщений: 6,030
Написано 1,469 полезных сообщений
(для 2,690 пользователей)
Ответ: delete [] const char

msvs 2012. не компилируется))

после дописания main и прочего выводит eq
(Offline)
 
Ответить с цитированием
Старый 15.05.2014, 12:36   #4
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,900
Написано 2,149 полезных сообщений
(для 5,782 пользователей)
Ответ: delete [] const char

msvc 2010: eq
__________________
бложик
geom.io
твиттер
(Online)
 
Ответить с цитированием
Старый 15.05.2014, 16:04   #5
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 977
Написано 388 полезных сообщений
(для 630 пользователей)
Ответ: delete [] const char

Сообщение от impersonalis Посмотреть сообщение
Меня всё устраивает, я ко всему привык, я это знаю. НО. Не кажется ли вам это слегка нелогичным?
Ну почему, почему одновременно:
1) нельзя менять данные, адресуемые указателем const char *
2) можно высвободить память, адресуемую указателем const char *
Потому что память высвобождает система (например вызовом через WinAPI), до вызова ничего противозаконного не происходит, а компилятор не имеет представление что внутри winapi творится, ведь dll линкуется во время запуска приложения.

И кстати delete можно перегрузить так, что он ничего менять/удалять не будет.

Идея ооп также заключается в том что ты сам должен позаботиться чтобы деструктор корректно удалил данные не испортив их.

А также имхо квалификаторы в с++ в целом для программиста - их всегда можно поменять кастами.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
falcon (26.05.2014)
Старый 04.06.2014, 10:40   #6
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,073
Написано 247 полезных сообщений
(для 514 пользователей)
Ответ: delete [] const char

Сообщение от impersonalis Посмотреть сообщение
Меня всё устраивает, я ко всему привык, я это знаю. НО. Не кажется ли вам это слегка нелогичным?
Ну почему, почему одновременно:
1) нельзя менять данные, адресуемые указателем const char *
2) можно высвободить память, адресуемую указателем const char *
    const char *n=new char[10];
    n[0]=0; // НЕЛЬЗЯ
    delete[]n;//МОЖНО
Типа снёс к чертям кусок памяти - это ничего страшного, это же не изменение данных. Можно возразить, что оператор delete формально применяется не к данным, а к самому указателю на них. Но ведь
const char * const n=new char[10];
тоже можно удалить.
Выходит бажного деструктор пофиксит действует ещё одно правило: разрешается высвободить память с любым спецификаторм доступа.
Отличный способ выстрелить себе в ногу, попробовав удалить константную строку.
    const char * const n="222";
    cout<<n<<endl;
    delete[]n;
И хоть приведённая конструкция на GCC не взывала сбоя, в 5.2.2. ("Язык программирования C++" Страуструпа) конструкции типа
    char *n="111";
    n[2]=0;
сопровождаются отметкой о неопределённости результата.

Кстати, пользуясь случаем, хочу провести мини-тест используемых компиляторов. Сообщите результат выполнения кода
const char *p="111";
    const char *q="111";
    if(p==q){
        cout<<"eq"<<endl;
    }
    else{
        cout<<"!eq"<<endl;
    }
и используемый компилятор (на всякий случай и IDE; опционально - флаги компиляции, режим сборки).

Твоюж мать! У тебя не массив константный, а данные в нем, массив грохнуть можно (указатель точнее), данные менять нет, ВСЕ!
З.Ы. деструкторы могут выполняться для константных объектов
(Offline)
 
Ответить с цитированием
Старый 04.06.2014, 11:18   #7
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 03.09.2005
Сообщений: 14,014
Написано 6,795 полезных сообщений
(для 20,916 пользователей)
Ответ: delete [] const char

Во-первых, я попросил бы не касаться моих родственников.
Во-вторых - перестать истерить.
В-третьих - замечание интересное, но в рамках уже сказанного выше - не актуальное.

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

Вот если б вместо эмоций повнимательнее присмотреться к:
Меня всё устраивает, я ко всему привык, я это знаю. НО. Не кажется ли вам это слегка нелогичным?
то можно сделать вывод, что вопрос то стоит несколько в иной плоскости. И именно такие "метафизические" вопросы я частенько и задаю, предварив их соответствующей пометкой. И именно к этому мы и пришли "удаление не есть модификация" (хоть несколько странно с обывательской точки зрения, но объекты как-то надо уничтожать [хотя на практике, компилятор на вряд ли будет очищать память из-под константных строк, т.к. изначально вовлекает их в оптимизации]).
const char *x;
    const char *y;

    x="123";
    cout<<(void*)x<<endl;
    delete[]x;
    x="234";
    cout<<(void*)x<<endl;

    y=new char[3];
    cout<<(void*)y<<endl;
    delete[]y;
    y=new char[3];
    cout<<(void*)y<<endl;
На самом деле содержимое x ("123") не удалится, память для "234" будет взята новая. При этом y удаляется "по-настоящему": память для второго массива имеет тот же адрес, т.к. она уже доступна для использования.


И ещё:
Сообщение от pozitiffcat Посмотреть сообщение
массив грохнуть можно (указатель точнее), данные менять нет,
смею указать на ошибку: указатель останется "живым". Он, в отличии от адресуемого куска памяти, в приведённых примерах создаётся не в куче (представляет собой т.н. в некоторых книгах "автоматическую" переменную), удалён при вызове delete не будет, и повторно может использоваться для хранения иных адресов. "Грохнута", как Вы выражаетесь, будет память, адресуемая данным указателем. Но впрочем, к чему эти формальности, ведь "в интернете кто-то не прав".
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 21:27.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com