32bit_me (32bit_me) wrote,
32bit_me
32bit_me

Проблемы с delete[]?

Originally published at 32 bit.me. You can comment here or there.

Недавно в блоге Алёны (http://alenacpp.blogspot.com/2010/06/delete.html) был опубликован пост «Проблемы с delete[]«, где был приведён пример вот такого кода:

A* a = new B[T];
delete[] a;

представляющего собой отрывок более длинного кода, приведённого в другом блоге (под девизом «Программирование – это просто!»): http://easy-coding.blogspot.com/2010/06/delete.html.
Адепты, достигшие просветления, уже поняли, что это работать не будет, а остальные могут читать дальше, и убедиться в том, что программирование – это не всегда просто.

Вот код из начального поста:

Листинг 1.

#define T 2
class A {
  public:
    virtual ~A() {
      p = 0;
    }
    int p;
  };
class B: public A {
  int a;
};
int main() {
  A* a = new B[T];
  delete[] a;
  return 0;
}

При запуске программа падает практически на любом компиляторе, кроме VisualStudio (и некоторых других).

Давайте разбёремся в том, что здесь неправильного, почему программа падает, и, самое главное, в том, почему она кое-где НЕ падает (хотя должна).

Примечание: в комментариях к блогу Алёны некто soonts пишет:

Как обычно, нормальные ОС + IDE этой проблемой не затронуты: в мире Windows всё работает.

Вот вам и объяснение: программа работает исключительно благодаря магической силе MS Windows и лично Билла Гейтса. Я надеюсь, что среди моих читателей не будет столь малообразованных молодых людей, которые делают такие обобщения, не разобравшись в сути вопроса.

Read the rest of this entry »

Tags: c++, программирование, статьи
Subscribe

  • Ретрожурнал

    Удивительно, но во времена ссср издавался американский журнал на русском языке "Электроника" ("Electronics"). Переводом занималось издательство…

  • Выниматели микросхем

    Продаётся на барахолке такое чудо: Спрашивается, нахрена и кому понадобились микросхемы с этой платы? Драгметаллов в них нет, вставить их куда-то…

  • Реальная история разработки Commodore C128

    Опубликовал на хабре новый перевод: Реальная история разработки Commodore C128. Заходите, ставьте плюсики, комментируйте там или здесь.

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments