/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
new & delete
Fra : Bertel Brander


Dato : 29-06-05 20:02

Hej NG,

Hvis jeg vil lave mine egne new og delete:

void * operator new (size_t aSize, Whatever aWhatever)
{
// Stuff
}

void operator delete(void *p, Whatever aWhatever)
{
// Stuff
}

Så kan jeg allokere med:
int *p = new int(Something);

Men hvordan bruger jeg min egen delete?

Jeg ved godt at jeg skal have new[] og delete[] også.

At overloade new og delete globalt er IKKE en option,
jeg kan heller ikke overloade malloc og free.

Jeg overvejede at lave en destroy template funktion,
men hvis den bruges i.s.f delete[] hvordan finder
jeg så antallet af elementer i array'et?

Jeg kan godt lave pr. class new og delete, men
det er ikke en løsning med POD.

Nogen gode ideer?
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

 
 
Bertel Brander (29-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 29-06-05 20:27

Bertel Brander wrote:
> Så kan jeg allokere med:
> int *p = new int(Something);

Det skal naturligvis være:
int *p = new(Something) int;

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Michael Rasmussen (29-06-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 29-06-05 20:42

On Wed, 29 Jun 2005 21:02:10 +0200, Bertel Brander wrote:

> Hvis jeg vil lave mine egne new og delete:
>
til hvilket formål? Nu kender jeg jo ikke din formåen, men jeg tvivler
dog på, at du kan lave en bedre implementation af new og delete, end den
der af implementeret af din compiler

> Nogen gode ideer?
Din new bør vil have en privat oplysning om adresse på datastrukturen,
og mangler du blot at kende til størrelsen. Lidt problematisk med
dynamiske datastrukturer, men i et sådan tilfælde må datastrukturen
nødvendigvis kende til sin egen størrelse. Problemet er så her, at hvis
vi taler om klasser, vil denne oplysning nok være at finde som en privat
attribut, hvorfor delete bliver nødt til at være gjort til friend.

En tanke, der strejer mig, er, at new og delete begge nedarver fra samme
abstrakte klasse, som automatisk er friend for alle afledte klasser.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Bertel Brander (29-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 29-06-05 20:58

Michael Rasmussen wrote:
> On Wed, 29 Jun 2005 21:02:10 +0200, Bertel Brander wrote:
>
>
>>Hvis jeg vil lave mine egne new og delete:
>>
>
> til hvilket formål?

Hvis man forestiller sig et system hvor der er mindre en
uendelig meget RAM, kunne man bruge det til at give
requests for memory prioritet.

Nu kender jeg jo ikke din formåen, men jeg tvivler
> dog på, at du kan lave en bedre implementation af new og delete, end den
> der af implementeret af din compiler

Det kan jeg godt, men det er ikke det vigtigste formål.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (29-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 29-06-05 21:06


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c2f02f$0$239$edfadb0f@dread11.news.tele.dk...

[8<8<8<]
> Så kan jeg allokere med:
> int *p = new int(Something);

Den går ikke, hvis det er en del af implemeteringen af din "operator new".
"operator new" returnerer rå hukommelse - ikke hukommelse hvor der allerede
ligger et objekt (heller ikke selv om det har typen int).
Der er en skarp skelnen mellem allokering af hukommelse (operator new) og
initialisering (constructor)

Nå - ok, det var heller ikke hvad du mente

[8<8<8<]
> At overloade new og delete globalt er IKKE en option,
> jeg kan heller ikke overloade malloc og free.

Du kan lave en klasse specifik operator new/operator delete eller du kan
lave en global operator new/operator delete, som tager en ekstra parameter
parameter:

#include <new>
#include <iostream>

using namespace std;

class foo
{
public:
foo()
{ cout << "foo::foo" << endl; }
~foo()
{ cout << "foo:foo" << endl; }
};

enum tag_my_memory_pool
{
MMP
};

void *operator new (size_t size, tag_my_memory_pool) throw (std::bad_alloc)
{
return operator new(size);
}

void operator delete(void *p, tag_my_memory_pool)
{
operator delete(p);
}

int main()
{
foo* fp = new (MMP) foo;
fp->~foo();
operator delete (fp, MMP);
}


Nedlæggelsen er ligefrem køn - men det er den eneste måde jeg kunne finde ud
at at rydde op på.

Venlig hilsen

Mogens Hansen



Bertel Brander (29-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 29-06-05 21:19

Mogens Hansen wrote:
> int main()
> {
> foo* fp = new (MMP) foo;
> fp->~foo();
> operator delete (fp, MMP);
> }
>
>
> Nedlæggelsen er ligefrem køn - men det er den eneste måde jeg kunne finde ud
> at at rydde op på.

Dette er netop problemet. Jeg kan godt pakke de to linier ind i
en template funktion, men hvis der blev allokeret et array,
hvordan ved jeg så hvor mange elementer der er i array'et?

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (29-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 29-06-05 21:38


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c30233$0$209$edfadb0f@dread11.news.tele.dk...
> Mogens Hansen wrote:
>> int main()
>> {
>> foo* fp = new (MMP) foo;
>> fp->~foo();
>> operator delete (fp, MMP);
>> }
>>
>>
>> Nedlæggelsen er ligefrem køn - men det er den eneste måde jeg kunne finde
>> ud at at rydde op på.
>
> Dette er netop problemet. Jeg kan godt pakke de to linier ind i
> en template funktion, men hvis der blev allokeret et array,
> hvordan ved jeg så hvor mange elementer der er i array'et?

Du kan lade "operator new []" allokere lidt ekstra plads som ligger før den
adresse der returneres, hvor den husker hvormange elementer der er
allokeret. Du skal lige huske at pointeren der returneres skal være allignet
rigtigt.
Den information kan du så bruge når det frigives.

Venlig hilsen

Mogens Hansen



Michael Rasmussen (29-06-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 29-06-05 21:47

On Wed, 29 Jun 2005 22:38:23 +0200, Mogens Hansen wrote:

> Du kan lade "operator new []" allokere lidt ekstra plads som ligger før
> den adresse der returneres, hvor den husker hvormange elementer der er
> allokeret. Du skal lige huske at pointeren der returneres skal være
> allignet rigtigt.
> Den information kan du så bruge når det frigives.
Hvordan hvis objektet foo håndterer initialiseringen af dette array,
hvordan vil du så sørge for, at foo opdaterer antallet af elementer på
en adresse, der teknisk set er ukendt for foo? I modsat fald vil delete jo
ikke kende det korrekte antal af elementer.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (30-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 30-06-05 07:07


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2005.06.29.20.46.30.865884@miras.org...
> On Wed, 29 Jun 2005 22:38:23 +0200, Mogens Hansen wrote:
>
>> Du kan lade "operator new []" allokere lidt ekstra plads som ligger før
>> den adresse der returneres, hvor den husker hvormange elementer der er
>> allokeret. Du skal lige huske at pointeren der returneres skal være
>> allignet rigtigt.
>> Den information kan du så bruge når det frigives.
> Hvordan hvis objektet foo håndterer initialiseringen af dette array,
> hvordan vil du så sørge for, at foo opdaterer antallet af elementer på
> en adresse, der teknisk set er ukendt for foo? I modsat fald vil delete jo
> ikke kende det korrekte antal af elementer.

Det er ikke foo constructoren der skal holde styr på størrelsen - det er
"operator new" som jo netop får den information med som parameter.

Venlig hilsen

Mogens Hansen



Bertel Brander (29-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 29-06-05 21:47

Mogens Hansen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:42c30233$0$209$edfadb0f@dread11.news.tele.dk...
>
>>Mogens Hansen wrote:
>>
>>>int main()
>>>{
>>> foo* fp = new (MMP) foo;
>>> fp->~foo();
>>> operator delete (fp, MMP);
>>>}
>>>
>>>
>>>Nedlæggelsen er ligefrem køn - men det er den eneste måde jeg kunne finde
>>>ud at at rydde op på.
>>
>>Dette er netop problemet. Jeg kan godt pakke de to linier ind i
>>en template funktion, men hvis der blev allokeret et array,
>>hvordan ved jeg så hvor mange elementer der er i array'et?
>
>
> Du kan lade "operator new []" allokere lidt ekstra plads som ligger før den
> adresse der returneres, hvor den husker hvormange elementer der er
> allokeret. Du skal lige huske at pointeren der returneres skal være allignet
> rigtigt.
> Den information kan du så bruge når det frigives.


Ja, jeg kan godt gemme information om hvor mange bytes, der skulle
allokeres, men jeg er ikke sikker på at der er nogen entydig
sammenhæng mellem antallet af bytes og antallet af elementer i
array'et.
new[] operatoren kender normalt ikke typen på det der skal allokeres
og kan dermed ikke beregne antallet af elementer.
delete[] får måske en pointer til en afledt class, og så kan den vel
heller ikke beregne antallet.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (30-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 30-06-05 07:04


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c308be$0$261$edfadb0f@dread11.news.tele.dk...

[8<8<8<]
> Ja, jeg kan godt gemme information om hvor mange bytes, der skulle
> allokeres, men jeg er ikke sikker på at der er nogen entydig
> sammenhæng mellem antallet af bytes og antallet af elementer i
> array'et.
> new[] operatoren kender normalt ikke typen på det der skal allokeres
> og kan dermed ikke beregne antallet af elementer.
> delete[] får måske en pointer til en afledt class, og så kan den vel
> heller ikke beregne antallet.

Du kender typen i den template funktion der skal frigive arrayet.
Dermed kender du størrelsen på hvert objekt og kan du beregne antal
objekter.

Måske var det en ide at overveje at bruge "std::vector" med en speciel
allokator.

Venlig hilsen

Mogens Hansen



Bertel Brander (30-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 30-06-05 19:55

Mogens Hansen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:42c308be$0$261$edfadb0f@dread11.news.tele.dk...
>
> [8<8<8<]
>
>>Ja, jeg kan godt gemme information om hvor mange bytes, der skulle
>>allokeres, men jeg er ikke sikker på at der er nogen entydig
>>sammenhæng mellem antallet af bytes og antallet af elementer i
>>array'et.
>>new[] operatoren kender normalt ikke typen på det der skal allokeres
>>og kan dermed ikke beregne antallet af elementer.
>>delete[] får måske en pointer til en afledt class, og så kan den vel
>>heller ikke beregne antallet.
>
>
> Du kender typen i den template funktion der skal frigive arrayet.
> Dermed kender du størrelsen på hvert objekt og kan du beregne antal
> objekter.

Desværre er det ikke så let.
Jeg lavede et lille test project:

#include <iostream>
#include <new>

enum Whatever
{
Something
};

class X
{
public:
X() : x(Next++)
{}
~X()
{}
int x;
static int Next;
};

int X::Next;

void *operator new(size_t aSize)
{
return malloc(aSize);
}

void *operator new[](size_t aSize)
{
return malloc(aSize);
}

void *operator new[] (size_t aSize, Whatever aWhatever)
{
std::cout << aSize << std::endl;
size_t *p = (size_t *)malloc(aSize + sizeof(size_t));
*p = aSize;
p += 1;
std::cout << "New[] returning: " << p << std::endl;
return p;
}

template<typename T> void destroy(T *t)
{
std::cout << "destroy receiving: " << t << std::endl;
size_t n = *(size_t *)((char *)t - sizeof(size_t));
std::cout << n << " " << sizeof(T) << std::endl;
for(size_t i = 0; i < n/sizeof(T); i++)
t[i].~T();
}

int main()
{
X *p;
p = new(Something) X[4];
destroy(p);
p = new(Something) X[5];
destroy(p);
}

Når jeg kører det kan jeg se at den addresse som new returnerer
IKKE er den adresse om destroy får.
Man kunne måske finde addressen, men koden skal helst være
rimelig portabelt.

> Måske var det en ide at overveje at bruge "std::vector" med en speciel
> allokator.

Der bruges en del std::vector og std::list, som alle skal bruge en
speciel allokator, desværre er der en del char/int/whatever *,
som ikke kan laves om til std::vector.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (30-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 30-06-05 21:12


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c44000$0$274$edfadb0f@dread11.news.tele.dk...
> Mogens Hansen wrote:
>> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
>> news:42c308be$0$261$edfadb0f@dread11.news.tele.dk...
>>
>> [8<8<8<]
>>
>>>Ja, jeg kan godt gemme information om hvor mange bytes, der skulle
>>>allokeres, men jeg er ikke sikker på at der er nogen entydig
>>>sammenhæng mellem antallet af bytes og antallet af elementer i
>>>array'et.
>>>new[] operatoren kender normalt ikke typen på det der skal allokeres
>>>og kan dermed ikke beregne antallet af elementer.
>>>delete[] får måske en pointer til en afledt class, og så kan den vel
>>>heller ikke beregne antallet.
>>
>>
>> Du kender typen i den template funktion der skal frigive arrayet.
>> Dermed kender du størrelsen på hvert objekt og kan du beregne antal
>> objekter.
>
> Desværre er det ikke så let.
> Jeg lavede et lille test project:
>
> #include <iostream>
> #include <new>
>
> enum Whatever
> {
> Something
> };
>
> class X
> {
> public:
> X() : x(Next++)
> {}
> ~X()
> {}
> int x;
> static int Next;
> };
>
> int X::Next;
>
> void *operator new(size_t aSize)
> {
> return malloc(aSize);
> }
>
> void *operator new[](size_t aSize)
> {
> return malloc(aSize);
> }
>
> void *operator new[] (size_t aSize, Whatever aWhatever)
> {
> std::cout << aSize << std::endl;
> size_t *p = (size_t *)malloc(aSize + sizeof(size_t));
> *p = aSize;
> p += 1;
> std::cout << "New[] returning: " << p << std::endl;
> return p;
> }
>
> template<typename T> void destroy(T *t)
> {
> std::cout << "destroy receiving: " << t << std::endl;
> size_t n = *(size_t *)((char *)t - sizeof(size_t));
> std::cout << n << " " << sizeof(T) << std::endl;
> for(size_t i = 0; i < n/sizeof(T); i++)
> t[i].~T();
> }
>
> int main()
> {
> X *p;
> p = new(Something) X[4];
> destroy(p);
> p = new(Something) X[5];
> destroy(p);
> }
>
> Når jeg kører det kan jeg se at den addresse som new returnerer
> IKKE er den adresse om destroy får.

Det lyder underligt.
Jeg kan ikke hurtigt se hvad der er galt - men det er muligt.

I går skrev jeg noget næsten tilsvarende (det var det udkommenterede kode
der kørte).

#include <new>
#include <iostream>

using namespace std;

class foo
{
public:
foo()
{ cout << "foo::foo(0x" << hex << this << ")" << endl; }
~foo()
{ cout << "foo:foo(0x" << hex << this << ")" << endl; }
};

enum tag_my_memory_pool
{
MMP
};

void* operator new [] (size_t size, tag_my_memory_pool) throw
(std::bad_alloc)
{
// void* mem = operator new(size + sizeof(size_t));
// size_t* s = reinterpret_cast<size_t*>(mem);
// *s = size;
// return reinterpret_cast<char*>(mem) + sizeof(size_t);
return operator new (size);
}

void operator delete [] (void* mem, tag_my_memory_pool)
{
operator delete (reinterpret_cast<char*>(mem) - sizeof(size_t));
}

template <typename T, typename P>
void delete_array_pool(T* first_obj, P pool)
{
if(!first_obj)
return;

void* mem = first_obj;
size_t* s = reinterpret_cast<size_t*>(reinterpret_cast<char*>(mem) -
sizeof(size_t));
const size_t size = (*s)/*/sizeof(foo)*/;
for(size_t i = 0; size != i; ++i) {
T* t = &first_obj[size-i-1];
t->~T();
}

operator delete [] (first_obj, pool);
}

int main()
{
foo* fp = new (MMP) foo[7];
delete_array_pool (fp, MMP);
}

Der var det samme adresse "operator new []" returnerede som
"delete_array_pool" fik.
Det gik også fint nok med at skrive størrelsen på blokken i "operator new
[]".
MEN, engentligt ikke overraskende, skriver implementeringerne (compilerne)
som jeg prøvede også i området før den adresse som "operator new []"
returner. Og egentligt ikke overraskende skriver den hvormange elementer der
er i arrayet

Således virker den kode der ikke er udkommenteret fint på de 2 compilere jeg
prøvede med - men det er _ikke_ portabelt eller på nogen måde
veldokumenteret at det burde virke.

> Man kunne måske finde addressen, men koden skal helst være
> rimelig portabelt.
>
>> Måske var det en ide at overveje at bruge "std::vector" med en speciel
>> allokator.
>
> Der bruges en del std::vector og std::list, som alle skal bruge en
> speciel allokator, desværre er der en del char/int/whatever *,
> som ikke kan laves om til std::vector.

Ting (char/int/whatever) der ligger i en std::vector kan sagtens overføres
til funktioner der forventer et array af ting.
Men det hjælper måske ikke på dit problem.

Venlig hilsen

Mogens Hansen



Bertel Brander (30-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 30-06-05 21:40

Mogens Hansen wrote:
> Således virker den kode der ikke er udkommenteret fint på de 2 compilere jeg
> prøvede med - men det er _ikke_ portabelt eller på nogen måde
> veldokumenteret at det burde virke.

Løsningen bliver nok at class'er kommer til at arve fra en class der
implementerer new og delete.

Men hvorfor kan man ikke bare skrive:
T *t = new(whatever) T[4];
delete[] (whatever) t;

(Det ville måske være for let)

> Ting (char/int/whatever) der ligger i en std::vector kan sagtens overføres
> til funktioner der forventer et array af ting.
> Men det hjælper måske ikke på dit problem.

Et af problemerne er at der er ca. 500 new og ca. lige så mange delete
med array's af POD. Mange af disse biver i et multi trådet system
overført mellem et hav af class'er.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (01-07-2005)
Kommentar
Fra : Mogens Hansen


Dato : 01-07-05 05:41


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c45896$0$203$edfadb0f@dread11.news.tele.dk...

[8<8<8<]
> Løsningen bliver nok at class'er kommer til at arve fra en class der
> implementerer new og delete.

Overvej at bruge template i stedet for arv.
Noget i retning af:

template <typename T>
class special_allocated
{
public:
operator T& ();
operator const T& () const;

void * operator new(size_t size) throw (std::bad_alloc);
etc...
};

Husk at implementere alle former for new og delete.
Se eventuelt
C++ Coding Standards
Herb Sutter, Andrei Alexandrescu
ISBN 0-321-11358-6
punkt 45 og 46

>
> Men hvorfor kan man ikke bare skrive:
> T *t = new(whatever) T[4];
> delete[] (whatever) t;


Ja, det undrer også mig.
Jeg har ikke kunne finde eksempler på at det er muligt.

>
> (Det ville måske være for let)
>
>> Ting (char/int/whatever) der ligger i en std::vector kan sagtens
>> overføres til funktioner der forventer et array af ting.
>> Men det hjælper måske ikke på dit problem.
>
> Et af problemerne er at der er ca. 500 new og ca. lige så mange delete
> med array's af POD.

Man er ofte bedst tjent med ikke at have new og delete direkte på
applikations niveau.
Jeg er godt med på at det ikke hjælper dig hvis du sidder med et stort
program med mange new og delete på applikatiosn niveau.

Venlig hilsen

Mogens Hansen



Bertel Brander (01-07-2005)
Kommentar
Fra : Bertel Brander


Dato : 01-07-05 18:50

Mogens Hansen wrote:

>>Løsningen bliver nok at class'er kommer til at arve fra en class der
>>implementerer new og delete.
>
>
> Overvej at bruge template i stedet for arv.
> Noget i retning af:
>
> template <typename T>
> class special_allocated
> {
> public:
> operator T& ();
> operator const T& () const;
>
> void * operator new(size_t size) throw (std::bad_alloc);
> etc...
> };

Hvad er fordelen?
Så vidt jeg kan se kan man med din template class lave:
class Whatever
{};

special_allocated<Whatever> *W = new special_allocated<Whatever>;
....
delete W;

Hvilket kunne være en fordel hvis Whatever i nogle tilfælde skulle
allokeres med en speciel new, og i andre tilfælde default new.
Det er ikke nødvendigt i dette tilfælde.

> Man er ofte bedst tjent med ikke at have new og delete direkte på
> applikations niveau.
> Jeg er godt med på at det ikke hjælper dig hvis du sidder med et stort
> program med mange new og delete på applikatiosn niveau.

Problemet er at i embeddede miljøer kan "applikations" niveau
være mange ting. På nogle platforme er det alt. Så det er ikke
en option.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (01-07-2005)
Kommentar
Fra : Mogens Hansen


Dato : 01-07-05 19:27


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c5822d$0$293$edfadb0f@dread11.news.tele.dk...

[8<8<8<]
> Hvad er fordelen?

Du kan skrive koden een gang og bruge den med mange typer - også POD.
Det giver en mulighed for på en måde at overskrive "operator new/operator
delete" for både indbyggede typer og allerede definerede typer som ikke kan
laves om.

[8<8<8<]
> Hvilket kunne være en fordel hvis Whatever i nogle tilfælde skulle
> allokeres med en speciel new, og i andre tilfælde default new.

Også hvis man vil lave en særlig new og ikke kan finde nogen god måde at
gøre det på.

[8<8<8<]
> Problemet er at i embeddede miljøer kan "applikations" niveau
> være mange ting. På nogle platforme er det alt. Så det er ikke
> en option.

Der er sjældent gode argumenter for at bruge eksplicit "new []/delete[]"
frem for "std::vector" (eller noget tilsvarende).
Heller ikke i embeddede applikationer. Hvis først man har accepteret
dynamisk allokering og frigivelse er som regel en god ting at have det
håndteret af en klasse - f.eks. "std::vector".

En lille historisk bemærkning.
"vector" i STL (forgængeren for "std::vector") blev lavet til embeddede
systemer: laserprintere hos HP.

Venlig hilsen

Mogens Hansen



Mogens Hansen (01-07-2005)
Kommentar
Fra : Mogens Hansen


Dato : 01-07-05 06:31


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c45896$0$203$edfadb0f@dread11.news.tele.dk...

[8<8<8<]
> Men hvorfor kan man ikke bare skrive:
> T *t = new(whatever) T[4];
> delete[] (whatever) t;

Man har mulighed for at overskrive de globale "operator delete" og så ud fra
pointerens værdi afgøre hvordan den er allokeret og derudfra afgøre hvordan
den skal frigivis, så man kan skrive
T *t = new(whatever) T[4];
delete[] t;

Det kræver naturligvis runtime support.

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste