SORU
25 AĞUSTOS 2011, PERŞEMBE


Taban işaretçisi türetilmiş nesneleri bir dizi için bir işaret olabilir mi?

Bir iş görüşmesine gittim bugün ve bu ilginç bir soru verildi.

Bellek sızıntısı ve sanal dtor yok aslında yanı sıra, kod neden kaza yapar?

#include <iostream>

//besides the obvious mem leak, why does this code crash?

class Shape
{
public:
    virtual void draw() const = 0;
};

class Circle : public Shape
{
public:
    virtual void draw() const { }

    int radius;
};

class Rectangle : public Shape
{
public:
    virtual void draw() const { }

    int height;
    int width;
};

int main()
{
    Shape * shapes = new Rectangle[10];
    for (int i = 0; i < 10;   i)
        shapes[i].draw();
}

CEVAP
25 AĞUSTOS 2011, PERŞEMBE


Böyle dizin olamaz. Rectangles bir dizi tahsis ve shapes İlk işaretçisi saklı. shapes[1] ne zaman (shapes 1) kaldırma. Bu gelecek için bir işaretçi Rectangle ama Shape çatışmanın bir dizi sonraki Shape ne olurdu bir işaretçi vermeyecektir. Tabii ki, bu tanımsız davranıştır. Sizin durumunuzda, şanslı olmak ve kaza alıyoruz.

Rectangle bir işaretçi kullanarak dizin oluşturma düzgün çalışması yapar.

int main()
{
   Rectangle * shapes = new Rectangle[10];
   for (int i = 0; i < 10;   i) shapes[i].draw();
}

Dizideki Shapes çeşit var polymorphically bir dizi gerekir bunları kullanmak istiyorsanızişaretçilerŞekil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • The Amazing Atheist

    The Amazing

    20 Kasım 2006
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008
  • whatever

    whatever

    30 EYLÜL 2005