Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除调用析构函数吗?

我有一个类(A),它对其中一个字段使用堆内存分配。类A被实例化并存储为另一个类(B)中的指针字段。

当我完成对象B时,我调用DELETE,我假设它调用析构函数。但是这是否也

回答 2

KKKCobain

回答已采纳

发布于 2018-03-23 01:16:03

A的析构函数将在其生命周期结束时运行。如果你想让它的内存被释放并且析构函数运行,那么如果它被分配到堆上,你必须删除它。如果它被分配到堆栈上,这会自动发生(即当它超出范围时,请参阅RAII)。如果它是一个类的成员(不是一个指针,而是一个完整的成员),那么当包含对象被销毁时会发生这种情况。

代码语言:javascript
运行
AI代码解释
复制
class A
{
    char *someHeapMemory;
public:
    A() : someHeapMemory(new char[1000]) {}
    ~A() { delete[] someHeapMemory; }
};

class B
{
    A* APtr;
public:
    B() : APtr(new A()) {}
    ~B() { delete APtr; }
};

class C
{
    A Amember;
public:
    C() : Amember() {}
    ~C() {} // A is freed / destructed automatically.
};

int main()
{
    B* BPtr = new B();
    delete BPtr; // Calls ~B() which calls ~A() 
    C *CPtr = new C();
    delete CPtr;
    B b;
    C c;
} // b and c are freed/destructed automatically

在上面的例子中,每个删除和删除[]都是必需的。并且不需要删除(或确实可以使用),我不使用它。

auto_ptrunique_ptrshared_ptr等..非常适合做这个生命周期管理要容易得多:

代码语言:javascript
运行
AI代码解释
复制
class A
{
    shared_array<char> someHeapMemory;
public:
    A() : someHeapMemory(new char[1000]) {}
    ~A() { } // someHeapMemory is delete[]d automatically
};

class B
{
    shared_ptr<A> APtr;
public:
    B() : APtr(new A()) {}
    ~B() {  } // APtr is deleted automatically
};

int main()
{
    shared_ptr<B> BPtr = new B();
} // BPtr is deleted automatically

印度陆军医院

发布于 2018-03-23 02:14:30

当对New分配的指针调用DELETE时,将调用指向的对象的析构函数。

代码语言:txt
AI代码解释
复制
A * p = new A;

delete p;    // A:~A() called for you on obkect pointed to by p
和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

有没有Java的析构函数?

2542

调用云函数可以返回方法吗?

0341

腾讯云的服务器都是x86架构的吗?

1515

IM不能删除用户吗?

1917

请问可以批量删除吗?

1350
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档