Avatar billede zyxtem Nybegynder
15. august 2003 - 21:48 Der er 20 kommentarer og
2 løsninger

Hjælp til new

Hej eksperter

  Jeg er netop i gang med new og i min bog står der at når freestore er tomt så vil new tildele den brugte pointer NULL.

  For ligesom at teste dette har jeg lavet følgende simple program

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char *pointer;
   
    while(pointer != NULL)
    {
    pointer=new char[10000];
    cout<<"Succes\n";
   
    }
   
    cout<<"fyldt op\n";
   
    system("pause");
    return 0;
}
   
  Nu burde programmet jo skrive fyldt op når der ikke er mere plads men det bliver i stedet lukket af windows pgr. manglende hukommelse.

Mit spørgsmål er nu. har jeg forstået det med new ordentlig (Er mit lille kodeeksempel lavet rigtigt)
Avatar billede arne_v Ekspert
15. august 2003 - 22:00 #1
Jeg ville vende løkken:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char *pointer;
 
    do {
      pointer=new char[1000000];
      cout<<"Succes\n";
    } while(pointer != NULL);
 
    cout<<"fyldt op\n";
 
    system("pause");
    return 0;
}

fordi ellers tester du på en uinitialiseret pointer.
Avatar billede arne_v Ekspert
15. august 2003 - 22:01 #2
Mine resultater:

MS VC++ 6.0 - fanger fint
GCC 3.1 - abnormal program termination
BCB 5.5 - abnormal program termination
Avatar billede arne_v Ekspert
15. august 2003 - 22:03 #3
Ifølge Strutrup så skal en new der ikke kan allokere memory throwe en bad_alloc
exception !
Avatar billede zyxtem Nybegynder
15. august 2003 - 22:05 #4
du tabte mig ved throwe en bad_alloc exception.. Gider du forklare det
Avatar billede arne_v Ekspert
15. august 2003 - 22:07 #5
#include <iostream>
#include <cstdlib>
#include <new>

using namespace std;

int main()
{
    char *pointer;
 
    try
    {
      for(;;)
      {
          pointer=new char[1000000];
          cout<<"Succes\n";
      };
    }
    catch(bad_alloc)
    {
      cout<<"fyldt op\n";
    }

    system("pause");
    return 0;
}
Avatar billede arne_v Ekspert
15. august 2003 - 22:07 #6
MS VC++ 6.0 - uendelig løkke
GCC 3.1 - fanger fint
BCB 5.5 - fanger fint
Avatar billede arne_v Ekspert
15. august 2003 - 22:08 #7
Dejlig konsistens !

:-(
Avatar billede squashguy Nybegynder
15. august 2003 - 22:11 #8
Avatar billede arne_v Ekspert
15. august 2003 - 22:13 #9
Mit gæt er at da exceptions er ret nye i C++ så returnerede man i gamle
dage NULL og nu skal man smide den exception.
Avatar billede olennert Nybegynder
15. august 2003 - 22:51 #10
Nye og nye, i henhold til Bjarnes "The Design and Evolution of C++" afsnit 16.1, så går designet tilbage til 1987, med implementationer klar til brug i foråret 1992. Så det er altså 11 år siden. Og den første C++ implementation var klar til brug i 1983, men kun til internt brug hos Bell Labs. Eksternt brug kom først i 1985 med release E (see C++ Timeline i samme bog, kapitel 0).

Men der kom først std::bad_alloc på i forbindelse med ANSI C++ (som også introducerede new med nothrow, som ikke kaster bad_alloc, men returnerer 0:

int* p = new(nothrow) int[1000]; // Alloker 1000 ints
if (p) {
  // Allokering lykkedes
}
else {
  // Allokering mislykkedes
}
)
Avatar billede arne_v Ekspert
15. august 2003 - 23:01 #11
Ah en lille finess.

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char *pointer;
 
    do {
      pointer=new(nothrow) char[1000000];
      cout<<"Succes\n";
    } while(pointer != NULL);
 
    cout<<"fyldt op\n";
 
    system("pause");
    return 0;
}

MS VC++ 6.0 - fanger fint
GCC 3.1 - fanger fint
BCB 5.5 - fanger fint

Så det er nok den man skal satse på !
Avatar billede olennert Nybegynder
16. august 2003 - 00:01 #12
Tjah, personligt ville jeg nok nøjes med at konstatere at MS VC++ 6.0 er langt fra standarden (den er i øvrigt også *ret* dårlig til templates), og så som udgangspunkt bruge bad_alloc udgaven, evt. med en #ifdef med noget speciel VC++ kode. Eller brug VC++ 7.0, som skulle være noget bedre.
Avatar billede dilleberg Nybegynder
16. august 2003 - 13:02 #13
MSDN Library Visual Studio 6.0 siger om 'operator new function'

When a statement such as the following is encountered in a program, it translates into a call to the function operator new:

char *pch = new char[BUFFER_SIZE];

If the request is for zero bytes of storage, operator new returns a pointer to a distinct object (that is, repeated calls to operator new return different pointers). If there is insufficient memory for the allocation request, by default operator new returns NULL. You can change this default behavior by writing a custom exception-handling routine and calling the _set_new_handler run-time library function with your function name as its argument.

db
Avatar billede arne_v Ekspert
16. august 2003 - 17:05 #14
Og det gør den også (jævnfør mine eksperimenter) så den opfører sig
som dokumenteret.

Men ANSI C++ standarden siger at den skulle noget andet.
Avatar billede zyxtem Nybegynder
17. august 2003 - 11:10 #15
>>Arne gider du ikke lægge et svar med et link hvori jeg kan lære noget mere om new. (især det med new(nothrow))
Avatar billede arne_v Ekspert
17. august 2003 - 11:36 #16
Det var olennart der henledte min opmærksomhed på nothrow.

Jeg har desværre ikke noget godt link til det her.
Avatar billede tosssen Nybegynder
17. august 2003 - 12:36 #17
VC++ i 2002 udgaven opfylder heller ikke standarden m.h.t. templates, så hvis man vil køre den nyeste ISO/ANSI C++ med en microsoft compiler, så må man have fat i VC++ 2003
Avatar billede zyxtem Nybegynder
17. august 2003 - 16:22 #18
Så fortjener i vel egentlig begge point.. Arne og Olenart gider I ik lægge et svar???
Avatar billede arne_v Ekspert
17. august 2003 - 16:24 #19
svar
Avatar billede olennert Nybegynder
18. august 2003 - 12:29 #20
svar
Avatar billede olennert Nybegynder
18. august 2003 - 12:31 #21
Hvis du er interesseret i en god opslagsbog, så kan jeg anbefale Bjarne Stroustrup: The C++ Programming Language, Third Edition. Men den er altså ikke særlig god som lærebog.

"The Design and Evolution of C++" af samme forfatter er en meget interessant gennemgang af tankerne bag C++. Men den er nok ikke rigtig til at læse før man er en nogenlunde habil C++ koder.
Avatar billede zyxtem Nybegynder
18. august 2003 - 13:14 #22
Tak for rådene
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester