warning C4150: 删除指向不完整“XXX”类型的指针;没有调用析构函数

 

情况源于我的之前一片博客《C++ 智能指针》,在我写demo代码的时候。

 

向前申明了class Phone, 然后再U_ptr类析构函数中delete Phone的指针。

出现warning C4150: 删除指向不完整“XXX”类型的指针;没有调用析构函数

 

 

这个waring会导致内存泄露。前向申明的类的析构函数没有被调用

 

 

出现warning的代码如下:

 

#include <iostream>
using namespace std;

class ConnectManager;
class CommManager;
class Phone;

class U_ptr
{
friend class ConnectManager;
friend class CommManager;

public:
U_ptr(Phone *pH): use(0), pPhone(pH) { }
~U_ptr() { delete pPhone; }
private:
Phone *pPhone;
size_t use;
};
class Phone
{
public:
Phone() { cout << "Hello World!" << endl; }
~Phone() { cout << "Bye!" << endl; }
};
class ConnectManager
{
public:
ConnectManager(U_ptr *p): pUptr(p)
{
++pUptr->use;
cout << "ConnectManager: Hi I get the Phone" << endl;
cout << pUptr->use << " users" << endl;
}
~ConnectManager()
{
cout << "ConnectManaer: Can I delete the Phone?" << endl;
if (--pUptr->use == 0)
{
cout << "Yes, You can" << endl;
delete pUptr;
}
else
{
cout << "No, You can't, The Phone is in use" << endl;
cout << pUptr->use << " users" << endl;
}
}

private:
U_ptr *pUptr;
};
class CommManager
{
public:
CommManager(U_ptr *p): pUptr(p)
{
++pUptr->use;
cout << "CommManager: Hi I get the Phone" << endl;
cout << pUptr->use << " users" << endl;
}
~CommManager()
{
cout << "CommManager: Can I delete the Phone" << endl;
if (--pUptr->use == 0)
{
cout << "Yes, You can" << endl;
}
else
{
cout << "No, You can't. The Phone is in use" << endl;
cout << pUptr->use << " users" << endl;
}
}
private:
U_ptr *pUptr;
};
int main(void)
{
Phone *symbian = new Phone();
U_ptr *pU = new U_ptr(symbian);
ConnectManager connManager = ConnectManager(pU);
CommManager commManager = CommManager(pU);
}
 

 

 

出现原因:

 

class Phone;这种方式向前申明,其后面的类只能申明其指针,前向申明以后的类无法看到其类实体。

 

所以,delete的时候,Phone的析构函数对后面的类是透明不可见的,除非使用头文件包含。

时间: 2024-11-17 21:16:54

warning C4150: 删除指向不完整“XXX”类型的指针;没有调用析构函数的相关文章

提领指向不完全类型的指针

问题描述 提领指向不完全类型的指针 #include #include #include #include #define ID_MAX 10 #define NAME_MAX 20 #define MOBILE_MAX 15 #define ADDRESS_MAX 100 #define COMP_TEL_MAX 15 #define MAX 100 #define FAILURE 0 #define SUCCESS 1 struct perison { char id[ID_MAX]; ch

c语言中,一个已定义的指针变量被置空后是如何&amp;amp;quot;记得&amp;amp;quot;它以前所指向的变量的类型的?

问题描述 c语言中,一个已定义的指针变量被置空后是如何"记得"它以前所指向的变量的类型的? 如题,比如定义了一个整型的指针p指向整型变量a : int *p = &a ; 然后将p置空:p = null; 这个时候指针p中所存放的数据即地址已经被清空了,但是再次http://ask.csdn.net/#使用p时还是只能 将其指向整型类型的变量,而不能指向其他类型的变量(比如字符型变量),那么p是 怎么"记得"它在被定义时候的类型的?它的值不是已经被清零了吗?

c语言-C语言函数的形参(结构体类型)和实参类型(指针)可以不同吗?

问题描述 C语言函数的形参(结构体类型)和实参类型(指针)可以不同吗? int numstus; int lens; student pointer; void main() { int i=1; char str[2]; lens=100; pointer=(student *)malloc(lens*LEN); /分配内存*/ numstus=0; welcome(); /*欢迎界面*/ while(i>0) { i=menu_select(); /*控制菜单*/ switch(i) { c

简单总结C语言中各种类型的指针的概念_C 语言

C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念.  常量指针:首先它是一个指针,常量只是用来修饰指针的定语.其定义如下: char const * cp; char a='a'; 如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针.即指向常量的指针. cp=&a; //正常语法 *cp=a; //错误语法,因为其指向的值是一个常量  指针常量:首先它是一个常量

详解Unified Parallel C中的指针类型,指针算法

UPC 语言中的指针类型 UPC 语言把数据分为共享类型和私有类型.一个指针所指向的数据可能为共享类型或者私有类型,并且指针本身也可以是共享类型或者私有类型.因此 UPC 语言中的指针共有以下四种类型,参见图 1 指向私有数据私有类型指针 指向http://www.aliyun.com/zixun/aggregation/6267.html">共享数据私有类型指针 指向私有数据共享类型指针 指向共享数据共享类型指针 图 1. UPC 语言指针类型 指向私有数据私有类型指针 如图 1 中的

Delphi 的类型与指针

  谈谈 Delphi 的类型与指针[1] 先声明: 不要把我说的这些个东西当作教科书, 这都是自己的浅见; 同时希望得到指正. Delphi 的指针分为 "类型指针" 和 "无类型指针" 两类.Delphi 中的类型, 常用的也得有几百个, 我们可以给每种类型定义相应的类型指针.其实 Delphi 已经为很多类型预定义了指针, 譬如数据类型: Integer 有对应的 PInteger;Char 有对应的 PChar;string 有对应的 PString;再譬如

函数指针 c语言 指针-C语言指向函数的指针的调用

问题描述 C语言指向函数的指针的调用 int *d_bubblesort(int a[]int n)//数组长度为n的冒泡降序排序{int ij;int temp;for(i=0;i {for(j=n-1;j>i;j--){if(a[j]>a[j-1]){temp=a[j-1];a[j-1]=a[j];a[j]=temp;} }}return(a);} void main(){int i;int *p;int a[10]={65412398710};int (*fun)(intint);fun

结构体 赋值 初始化-结构体类型的指针初始化和赋值问题

问题描述 结构体类型的指针初始化和赋值问题 编程的时候我定义了一个结构体,结构体有几个变量的值我必须要赋初值,因为循环得用.结构体这样定义:typedef struct{ BYTE stream_Type; unsigned short PID; unsigned short InfoDescrip;}M_PICE;用的时候:M_PICE* p_Mpice = NULL;p_Mpice->InfoDescrip = 0;运行到上一句就报错Unhandled exception in DVB.ex

c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧?

问题描述 c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 如题:c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 解决方案 什么?复制构造函数? 解决方案二: C++类构造函数列表初始化C++类构造函数初始化列表c++中什么类型的成员变量只能在构造函数的初始化列表中进行 解决方案三: 真是初始化列表,跟复制构造函数没关系,调用复制构造函数要看你是如何初始化的 解决方案四: 参数列表初始化成员是调用成员的构造函数,但是什