[ glorius @ 22.11.2007. 01:13 ] @
Code:


#include <iostream>

using namespace std;

class A
{
public:
    void PrintMe()
    {
        cout << "Blaa??" << endl;
    }
};

void main()
{
    A * a = new A;

    new (&a[1]) A;       // navodno, "ovo poziva konstruktor"
    new (&a[2]) A;      

    for(int i=0;i<3;i++)
        a[i].PrintMe();
}



Ovo je inace iz DXUT koda DirectX 9...

Cini mi se da radi po sistemu realokacije... U glavnom, veoma zanimljivo i radi!!!
[ tosa @ 22.11.2007. 08:50 ] @
Ovo je placement new, koji konstruiše objekat na adresi koju mu proslediš, ne alocira svoju memoriju.
I kad smo kod toga, &a[1] nije validna memorija, alocirao si samo jednu instancu klase a ne niz, ako radi - radi slučajno.
[ Eurora3D Team @ 06.12.2007. 21:06 ] @
Radi i ovo , bez new (MinGW i MS VC++)
Code:

#include <iostream>
using namespace std;

class A
{
public:
    void PrintMe()
    {
        cout << "Blaa??" << endl;
    }
};

int main()
{
    A *a = 0;

    a->PrintMe();
    cout << endl;

    for(int i = 0;i < 3;i++)
    {
        a[i].PrintMe();
        cout << &a[i] << endl;
    }
    cout << endl;
    return 0;
}
[ glorius @ 06.12.2007. 21:26 ] @
hmm... duhovi? :P

Jednostavno, adresa od a = 0x00000000...

new, u sustini, samo 'nadje' memorijsku lokaciju koja je u trenutku pogodna za smestanje podataka...

U ovom slucaju smatra da je a velicine 1 bajt iako klasa nema podataka... Ubacimo jedan 'int a' u klasu... :)

Veoma zanimljivo...
[ Eurora3D Team @ 07.12.2007. 00:30 ] @
Kad ubacimo int u klasu pointer je 4 bajta.
Ali radi ok
new i alocira memoriju na adresi. Npr nemozemo da stavimo a->a=1; pre new
Code:

#include <iostream>
using namespace std;

class A
{
public:
    int a;
    A()
    {
        a = 0;
    }
    void PrintMe()
    {
        cout << "Blaa??" << endl;
    }
};

int main()
{
    A *a = (A*)0x330000; // ako je slobodna

    a->PrintMe();
    cout << endl;

    cout << a << endl;
    a++;
    cout << a << endl;
    a++;
    cout << a << endl;

    cout << endl;

    int i;
    for( i = 0;i < 3;i++)
    {
        a[i].PrintMe();
        cout << &a[i] << endl;
    }
    cout << endl;

    A *aa=new A[3]; // konstuktor je prvi put pozvan ovde
    for( i = 0;i < 3;i++)
    {
        aa[i].PrintMe();
        cout << &aa[i] << endl;
    }
    delete [] aa;
    cout << endl;
    return 0;
}



[Ovu poruku je menjao Eurora3D Team dana 07.12.2007. u 01:42 GMT+1]