Subject: Possible error with C++ compilers on 64 bit PC running 
         SUSE 10.3 with memory allocation

In C++ you can request space with the new command but if you
repeatedly do this then it should eventually fail.  The following
program is designed to illustrate this by first repeatedly asking
for 1Mbyte until the requests fails.  This is then done again
with blocks of double the size etc.

On 32 bit PCs the program behaves as expected and the output
is shown below.  However on a 64 bit PC with g++ version 4.2.1
and with the Sun linux compiler CC and with the intel compiler
icc no failure is ever reported.  This suggests a serious bug
in some aspect of the 64 bit system or have I made a mistake
myself?

The 64 bit PC with 4GB of RAM often runs very slowly and is
sometimes the slowest PC that I have had for many years with
many of the applications that I regularly run.
Could the above be the reason for the PC sometimes being so slow?

Any help in resolving the bug with the 64 bit system will be
appreciated.  My only solution at the moment is abandon the
use of the 64 bit operating system in favour of the 32 bit
version.

..................c++ program err64.cpp follows
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  char *c;
  char *a[11][8192];
  int b[11];

  int i, j, k, m=1024*1024;

  // .. request m bytes until the request fails
  for(j=0; j<11; j++)
  {
    for(i=0; i<8192; i++)
    {
      c=new (nothrow) char[m]; 
      if(c==NULL)break;
      a[j][i]=c;
    }

    // .. release the space
    for(k=0; k<i && k<8192; k++)delete[] a[j][k];
    b[j]=i;

    cout << setw(3) << j 
         << "  m=" << setw(12) << m 
         << "  b[j]=" << setw(8) << b[j];
    if(i>=2) cout << " pointer difference=" 
                  << setw(12) << a[j][i-2] -a[j][i-1];
    cout <<endl;
    // .. double m for the next attempt
    m=2*m;
  }
  return 0;
}
..................end of program


....output of g++ -v follows

Using built-in specs.
Target: x86_64-suse-linux
Configured with: ../configure --enable-threads=posix --prefix=/usr
--with-local-prefix=/usr/local --infodir=/usr/share/info
--mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64
--enable-languages=c,c++,objc,fortran,obj-c++,java,ada
--enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.2.1
--enable-ssp --disable-libssp --disable-libgcj --with-slibdir=/lib64
--with-system-zlib --enable-shared --enable-__cxa_atexit
--enable-libstdcxx-allocator=new --disable-libstdcxx-pch --program-suffix=-4.2
--enable-version-specific-runtime-libs --without-system-libunwind
--with-cpu=generic --host=x86_64-suse-linux
Thread model: posix
gcc version 4.2.1 (SUSE Linux)


....output of uname -a follows

Linux viglenvista 2.6.22.19-0.2-default #1 SMP 2008-12-18 10:17:03 +0100 x86_64
x86_64 x86_64 GNU/Linux



The compilation was done with the command
g++ err64.cpp


...output on 64 bit PC with 4GB of memory
...I did not expect all 8192 requests to succeed for every value of m.

  0  m=     1048576  b[j]=    8192 pointer difference=    -1052672
  1  m=     2097152  b[j]=    8192 pointer difference=    -2101248
  2  m=     4194304  b[j]=    8192 pointer difference=    -4198400
  3  m=     8388608  b[j]=    8192 pointer difference=    -8392704
  4  m=    16777216  b[j]=    8192 pointer difference=   -16781312
  5  m=    33554432  b[j]=    8192 pointer difference=   -33558528
  6  m=    67108864  b[j]=    8192 pointer difference=   -67112960
  7  m=   134217728  b[j]=    8192 pointer difference=  -134221824
  8  m=   268435456  b[j]=    8192 pointer difference=  -268439552
  9  m=   536870912  b[j]=    8192 pointer difference=  -536875008
 10  m=  1073741824  b[j]=    8192 pointer difference= -1073745920


...output on 32 bit PC with 1GB of memory and about 1GB of swap space
...this is approximately what I expected to happen

  0  m=     1048576  b[j]=    1609 pointer difference=    -1052672
  1  m=     2097152  b[j]=     806 pointer difference=    -2101248
  2  m=     4194304  b[j]=     403 pointer difference=    -4198400
  3  m=     8388608  b[j]=     201 pointer difference=    -8392704
  4  m=    16777216  b[j]=     100 pointer difference=   -16781312
  5  m=    33554432  b[j]=      50 pointer difference=   -33558528
  6  m=    67108864  b[j]=      25 pointer difference=   -67112960
  7  m=   134217728  b[j]=      12 pointer difference=  -134221824
  8  m=   268435456  b[j]=       6 pointer difference=  -268439552
  9  m=   536870912  b[j]=       3 pointer difference=  -536875008
 10  m=  1073741824  b[j]=       1


-- 
           Summary: 64 bit memory allocation possible error
           Product: gcc
           Version: 4.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: Mike dot Warby at brunel dot ac dot uk


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39271

Reply via email to