gpt4 book ai didi

c++ - C++ delete 语句的动态是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:07 24 4
gpt4 key购买 nike

这只是出于好奇,因为除了最基本的用途外,我没有在 c++ 中使用过 newdelete

我知道delete 会释放内存。我想知道的是它如何处理更复杂的情况?

例如,如果我有这样一个用户定义的类:

class MyClass
{
public:
MyClass();
~MyClass()
{
delete [] intArray;
}
//public members here
private:
int* intArray;
};

假设该类以某种方式为 intArray 分配内存,然后在析构函数中释放它,如果我这样使用该类会怎样:MyClass* myClass = new MyClass(); 并稍后使用 delete myclass;

发布它

delete 如何处理所有内存的释放?是否首先调用类析构函数以释放该类分配的所有内存(即 int* intArray),然后释放分配给该类的内存?

如果我有这样的类(class)会怎样:

class MyClass
{
public:
MyClass();
~MyClass()
{
delete anotherMyClass;
}
//public members here
private:
MyClass* anotherMyClass;
};

假设 anotherMyClass 没有分配构造函数,这会很快耗尽内存,如果有一个 MyClasses 链像链表一样相互连接怎么办?在这种情况下,析构函数中的 delete 语句会起作用吗?当调用析构函数时,是否会递归释放每个 anotherMyClass

您知道 newdelete 语句有什么特别奇怪的技巧或注意事项吗?

最佳答案

给定一个指向动态分配对象的指针 ( p),delete做两件事:

  1. 它调用动态分配对象的析构函数。注意当~MyClass()完成后,调用类类型的任何成员变量的析构函数。
  2. 释放动态分配对象占用的内存。

它不会在对象的成员变量中搜索其他指向 free 的指针;它不会释放任何其他内存,也不会执行任何其他操作。

如果需要释放intArray指向的内存, 你需要 delete它在 MyClass 的析构函数中.

然而,在几乎所有的 C++ 代码中,您都无需担心这一点。你应该使用像 shared_ptr 这样的智能指针, unique_ptr , auto_ptr , 和 scoped_ptr自动管理动态分配的对象。手动资源管理充其量是困难的,应尽可能避免。

这是更广泛的成语范围限制资源管理(SBRM,也称为资源获取即初始化,或 RAII)的一部分。这是迄今为止最重要的设计模式,需要理解并在 C++ 代码中随处使用。

如果你在类里面声明了这个:

boost::scoped_ptr<int> intArray;

然后当scoped_ptr<int>对象被销毁,它将释放它持有的指针。然后您无需执行任何操作来手动销毁该对象。

在编写良好的现代 C++ 代码中,您应该很少需要手动使用 delete .应该使用智能指针和其他 SBRM 容器来管理需要清理的任何类型的资源,包括动态分配的对象。


在您的第二个示例中,给定一个如下所示的链表:

x -> y -> z -> 0

你会有一个看起来像这样的操作顺序:

delete x;
x.~MyClass();
delete y;
y.~MyClass();
delete z;
z.~MyClass();
delete 0;
[free memory occupied by z]
[free memory occupied by y]
[free memory occupied by x]

链表中的对象将以相反的顺序销毁。

关于c++ - C++ delete 语句的动态是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com