Показать сообщение отдельно
Старый 15.05.2014, 13:49   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
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)
 
Ответить с цитированием