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

  • 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