Jun. 24th, 2010

32bit_me: (Default)

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 »

Profile

32bit_me: (Default)
32bit_me

July 2017

S M T W T F S
      1
2345678
9101112131415
16171819202122
232425262728 29
3031     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 19th, 2017 04:32 pm
Powered by Dreamwidth Studios