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

本文通过一个C++示例介绍了如何正确地管理内存,特别是当涉及到前向声明的类时。文章展示了不当的内存管理可能导致的问题,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

 

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

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

 

 

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

 

 

出现warning的代码如下:

 

 

 

 

出现原因:

 

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

 

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

### UE5 中 C++ 析构函数的使用方法及其行为 在 Unreal Engine 5 (UE5) 的开发环境中,C++ 是其主要编程语言之一。对于类对象生命周期管理而言,析构函数是一个非常重要的概念。以下是关于 UE5 中 C++ 析构函数的一些核心知识点: #### 1. 基本定义与作用 析构函数是一种特殊的成员函数,在对象销毁时自动调用。它的职责通常是释放动态分配的资源(如内存、文件句柄等),并清理任何可能引发泄漏的内容。 在 UE5 中,析构函数的行为与其他标准 C++ 应用程序一致。然而,由于引擎内部的对象管理和垃圾回收机制(例如 TWeakObjectPtr 和 UObject 生命周期管理器),开发者需要注意某些特定场景下的实现细节[^3]。 ```cpp class AMyClass : public UActorComponent { public: AMyClass() { /* Constructor logic */ } virtual ~AMyClass() override { // 清理逻辑写在这里 UE_LOG(LogTemp, Warning, TEXT("Destructing AMyClass")); } private: TArray<int*> DynamicMemoryArray; }; ``` #### 2. 虚拟析构函数的重要性 如果某个基类被设计成可以派生子类,则该基类应声明虚拟析构函数 `virtual ~CBase()`。这确保通过基类指针删除派生类实例时能够正确调用对应的析构链路[^4]。 举例来说: ```cpp UCLASS() class MYPROJECT_API UCBase : public UObject { GENERATED_BODY() public: UCBase() {} virtual ~UCBase() override { UE_LOG(LogTemp, Warning, TEXT("~UCBase")); } }; UCLASS() class MYPROJECT_API UCDerived : public UCBase { GENERATED_BODY() public: UCDerived() {} virtual ~UCDerived() override { UE_LOG(LogTemp, Warning, TEXT("~UCDerived")); } }; ``` 运行以下代码会依次打印 "~UCDerived" 和 "~UCBase": ```cpp UCBase* BasePointer = NewObject<UCDerived>(); delete BasePointer; ``` #### 3. UE5 特定注意事项 Unreal 使用了自定义的新建和删除操作符重载来支持 GC(Garbage Collection)。因此,通常情况下建议手动调用 `new` 或 `delete` 来创建或销毁 UObjects 及其衍生类型。而是应该依赖于引擎提供的工厂模式或者引用计数工具[^5]。 另外一点值得注意的是,当处理非 UObjects 类型的数据结构时(比如纯 STL 容器或其他第三方库组件),仍然需要遵循传统方式显式编写合适的构造与析构过程以防止潜在错误发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值