You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确释放struct结构体中的类成员变量并调用其析构函数?

问题1:delete &data.obj 写法是否合法?

完全不合法,属于严重的未定义行为

C++中delete关键字仅能用于释放**通过new表达式在堆上分配的独立对象。你代码中的data.obj是全局结构体data的内置成员变量,内存属于全局存储区,并不是new出来的堆内存,直接对其使用delete会破坏内存布局,轻则程序崩溃,重则堆结构被破坏出现随机异常。

如果你确实需要手动触发MyObject的析构函数,正确写法是直接调用析构函数:

data.obj.~MyObject();

注意:该写法仅适用于你手动用placement new构造对象的场景。普通场景下不要手动调用析构函数,否则对象生命周期结束时系统还会自动再调用一次析构函数,重复析构同一块内存会触发二次释放异常。


问题2:Data::obj改为空指针后调用Init函数崩溃的原因和解决方案

崩溃原因

你修改后的Data::obj默认值为nullptr,原InitMyObject的实现逻辑是对传入的指针解引用赋值:

*ptr = MyObject();

此时ptr是传入的空指针,直接解引用空指针属于非法内存访问,直接触发崩溃。

解决方案

根据你的使用场景可以选以下两种方案之一:

方案1:保留对象成员,手动控制生命周期

用std::optional封装成员变量,更安全可控:

#include <optional>
struct Data {
    std::optional<MyObject> obj;
};
extern Data data;

// 初始化
data.obj = MyObject();
// 手动释放,调用析构函数
data.obj.reset();

方案2:保留指针成员,修改初始化函数逻辑

修改InitMyObject改为给指针分配堆内存:

// 传指针的引用,确保修改外部的指针本身
void InitMyObject(MyObject*& ptr) {
    ptr = new MyObject();
}

struct Data {
    MyObject* obj = nullptr;
};
extern Data data;

// 调用初始化
InitMyObject(data.obj);
// 释放逻辑
delete data.obj;
data.obj = nullptr;

内容的提问来源于stack exchange,提问作者user16850544

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:45:03