Показать сообщение отдельно
Старый 04.06.2014, 14:40   #6
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: 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)
 
Ответить с цитированием