BUG: Deleting a Struct Typedef Causes C1059, C1063, or C1001 (133068)



The information in this article applies to:

  • Microsoft C/C++ for MS-DOS 7.0
  • Microsoft Visual C++ 1.0
  • Microsoft Visual C++ 1.5
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52
  • Microsoft Visual C++, 32-bit Learning Edition 4.0
  • Microsoft Visual C++, 32-bit Learning Edition 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
  • Microsoft Visual C++, 32-bit Professional Edition 2.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.1
  • Microsoft Visual C++, 32-bit Professional Edition 4.2

This article was previously published under Q133068

SYMPTOMS

The sample code fragment listed at the end of this article incorrectly deletes a typedef of a pointer to a structure, which generates the following compiler errors:
  • For Visual C++ 4.2 for Windows NT:
    fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'toil.c', line 4094)
  • For Visual C++ 4.1 for Windows NT:
    fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'toil.c', line 4051)
  • For Visual C++ 4.0 for Windows NT:
    fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'toil.c', line 3128)
  • For Visual C++ 2.x for Windows NT:
    fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'toil.c', line 2847)
  • For Visual C++ 1.0 for Windows NT:
    fatal error C1001: INTERNAL COMPILER ERROR (compiler file '@(#)main.c:1.82', line 289)
  • For Visual C++ version 1.5x for Windows:
    fatal error C1059: compiler is out of near heap space
  • For Visual C++ version 1.0 for Windows:
    fatal error C1063
  • For C/C++ version 7.0:
    fatal error C1001: INTERNAL COMPILER ERROR (compiler file '2pass/getattr.c', line 346) Contact Microsoft Product Support Services

RESOLUTION

The above error messages are misleading and do not point out the real problem, which is that you cannot delete a typedef. Additionally, the operand of delete must be a pointer returned by the new operator. Using delete on a pointer to an object not allocated with new gives unpredictable results.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

MORE INFORMATION

Sample Code to Reproduce Problem

/* Compile options needed: none
*/ 

typedef struct {
   int x;
}MY_STRUCT, *LPMY_STRUCT;

LPMY_STRUCT  pMyStruct = new MY_STRUCT;

void MyTestFunction()
{
   delete pMyStruct;   // ok.
   delete LPMY_STRUCT; // Can not delete a type.
}
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbBug kbCompiler kbCPPonly KB133068