[ 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]
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.