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

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • Break

    Break

    10 Aralık 2005
  • Stevie

    Stevie

    2 Mayıs 2010