Avatar billede birkebjerg Nybegynder
11. februar 2005 - 10:07 Der er 6 kommentarer og
1 løsning

heap spg

Hejsa!

Jeg har for sjov prøvet at se om man kunne fylde heapen ud og få retuneret 0 hvis den er fyldt.

Det er ikke lykkes hverken i windows eller med ontime. I windows lægger windows programmet ned og i ontime forsætter den med at tælle uden at jeg får retuneret 0.

Jeg bruger følgende kode:

do
    {
        name = new char[10999999];
        if (name = NULL) {
           
        cout << "Heapen fyldt!!!!!!!!!!!!!!!!!!!!";
            for (;;){}
        }
        i++;
        cout << i;
    }while(1==1);
Avatar billede arne_v Ekspert
11. februar 2005 - 11:21 #1
Før ANSI C++ returnerede new NULL hvis den ikke kunne allokere mere memory.

Men efter ANSI C++ så smider den en exception.

Så den skal du fange med try catch.
Avatar billede chries Nybegynder
11. februar 2005 - 14:38 #2
if (name = NULL) {
-->
if (name == NULL) {
Avatar billede arne_v Ekspert
11. februar 2005 - 14:49 #3
Ikke nok med nyere compiler.

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
  for(;;)
  {
      char *p = new char[10000000];
      if(p == NULL)
      {
          cerr << "Oops" << endl;
          return 1;
      }
  }
  return 0;
}

giver fejl.

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
  for(;;)
  {
      try
      {
          char *p = new char[10000000];
      }
      catch(bad_alloc ba)
      {
          cerr << "Oops" << endl;
          return 1;
      }
  }
  return 0;
}

catcher exception.
Avatar billede bertelbrander Novice
11. februar 2005 - 23:26 #4
Mig bekendt er der ingen krav om at en Ansi C++ kompilers new skal kaste en exception.

I C++ standarden står der:
An allocation function that fails to allocate storage can invoke the currently installed new_handler (18.4.2.2), if any. [Note: A programsupplied allocation function can obtain the address of the currently installed new_handler using the et_new_handler function (18.4.2.3). ] If an allocation function declared with an empty exceptionspecification (15.4), throw(), fails to allocate storage, it shall return a null pointer. Any other allocation function that fails to allocate storage shall only indicate failure by throwing an exception of class std::bad_alloc (18.4.2.1) or a class derived from std::bad_alloc.
Avatar billede bertelbrander Novice
11. februar 2005 - 23:43 #5
Og dog...
Default vil new kaste en exception, hvis ikke man har bedt den om andet, eller har overloadet new den.
Avatar billede arne_v Ekspert
12. februar 2005 - 00:00 #6
Det er ikke svært at få sin gode gamle NULL tilbage:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
  for(;;)
  {
      char *p = new(nothrow) char[10000000];
      if(p == NULL)
      {
          cerr << "Oops" << endl;
          return 1;
      }
  }
  return 0;
}

virker fint.
Avatar billede arne_v Ekspert
25. februar 2005 - 20:32 #7
Tid at afslutte spørgsmålet ?

Og et svar fra mig
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