|
1 | 1 | ---
|
2 | 2 | description: "Learn more about: Compiler Warning (level 2) C4150"
|
3 |
| -title: "Compiler Warning (level 2) C4150" |
| 3 | +title: Compiler warning (level 2) C4150 |
4 | 4 | ms.date: "11/04/2016"
|
5 | 5 | f1_keywords: ["C4150"]
|
6 | 6 | helpviewer_keywords: ["C4150"]
|
7 |
| -ms.assetid: ff1760ec-0d9f-4d45-b797-94261624becf |
8 | 7 | ---
|
9 | 8 | # Compiler Warning (level 2) C4150
|
10 | 9 |
|
11 |
| -deletion of pointer to incomplete type 'type'; no destructor called |
| 10 | +> deletion of pointer to incomplete type 'type'; no destructor called |
12 | 11 |
|
13 |
| -The **`delete`** operator is called to delete a type that was declared but not defined, so the compiler cannot find a destructor. |
| 12 | +The `delete` operator is called to delete a type that was declared but not defined. The compiler can't find the destructor to call because the definition isn't in the same translation unit as the `delete`. |
14 | 13 |
|
15 |
| -The following sample generates C4150: |
| 14 | +## Example |
| 15 | + |
| 16 | +The following sample generates C4150 by declaring but not defining `class IncClass`: |
16 | 17 |
|
17 | 18 | ```cpp
|
18 |
| -// C4150.cpp |
19 | 19 | // compile with: /W2
|
20 |
| -class IncClass; |
| 20 | +class IncClass; |
| 21 | + |
| 22 | +void NoDestruct( IncClass* pIncClass ) |
| 23 | +{ |
| 24 | + delete pIncClass; // C4150 |
| 25 | +} |
| 26 | +``` |
| 27 | +
|
| 28 | +To fix the issue, put the definition of `IncClass` in the same file as the `delete`. If the class is declared in a header file, it can be added to the file using `#include`. If the class isn't declared in a header file, the `NoDestruct` function definition may need to be moved into the same file as the `IncClass` definition. |
| 29 | +
|
| 30 | +```cpp |
| 31 | +// compile with: /W2 |
| 32 | +#include "IncClass.h" |
21 | 33 |
|
22 | 34 | void NoDestruct( IncClass* pIncClass )
|
23 | 35 | {
|
24 | 36 | delete pIncClass;
|
25 |
| -} // C4150, define class to resolve |
| 37 | +} |
| 38 | +``` |
| 39 | + |
| 40 | +C4150 will be emitted when the class is defined after the destructor call in the same file. In the following example `IncClass` is declared before being used, but defined after the `delete`: |
| 41 | + |
| 42 | +```cpp |
| 43 | +// C4150.cpp |
| 44 | +// compile with: /W2 |
| 45 | +class IncClass; |
26 | 46 |
|
27 |
| -int main() |
| 47 | +void NoDestruct( IncClass* pIncClass ) |
28 | 48 | {
|
| 49 | + delete pIncClass; // C4150 |
29 | 50 | }
|
| 51 | + |
| 52 | +class IncClass |
| 53 | +{ |
| 54 | +public: |
| 55 | + IncClass() = default; |
| 56 | + ~IncClass() = default; |
| 57 | +}; |
30 | 58 | ```
|
| 59 | +In this scenario, the use of `delete` needs to be after the class definition. |
| 60 | +```cpp |
| 61 | +// C4150.cpp |
| 62 | +// compile with: /W2 |
| 63 | +class IncClass; |
| 64 | +
|
| 65 | +void NoDestruct( IncClass* pIncClass ); |
| 66 | +
|
| 67 | +class IncClass |
| 68 | +{ |
| 69 | +public: |
| 70 | + IncClass() = default; |
| 71 | + ~IncClass() = default; |
| 72 | +}; |
| 73 | +
|
| 74 | +void NoDestruct( IncClass* pIncClass ) |
| 75 | +{ |
| 76 | + delete pIncClass; |
| 77 | +} |
| 78 | +
|
| 79 | +``` |
| 80 | + |
| 81 | +## See also |
| 82 | + |
| 83 | +* [Projects and build systems](../../build/projects-and-build-systems-cpp.md) |
| 84 | +* [Source files and source programs](../../c-language/source-files-and-source-programs.md) |
0 commit comments