Mik*_*ebb 4 c++ new-operator delete-operator
这仅仅是出于好奇的缘故,因为我没有使用过new,并delete在C++中,除了最基本的用途.
我知道delete释放记忆.我想知道的是它如何处理更复杂的案件?
例如,如果我有一个这样的用户定义的类:
class MyClass
{
public:
MyClass();
~MyClass()
{
delete [] intArray;
}
//public members here
private:
int* intArray;
};
Run Code Online (Sandbox Code Playgroud)
假设类以某种方式为内存分配内存intArray,然后在析构函数中释放它,如果我像这样使用类,那么:MyClass* myClass = new MyClass();稍后发布它delete myclass;
如何delete处理释放所有内存?是否首先调用类析构函数以释放由类(即int* intArray)分配的所有内存,然后释放分配用于保存类的内存?
如果我有这样的课程怎么办?
class MyClass
{
public:
MyClass();
~MyClass()
{
delete anotherMyClass;
}
//public members here
private:
MyClass* anotherMyClass;
};
Run Code Online (Sandbox Code Playgroud)
假设anotherMyClass没有使用构造函数分配,这会很快耗尽内存,如果有一个MyClasses链如链接列表那么相互附加怎么办?析构函数中的delete语句是否适用于这种情况?anotherMyClass当析构函数被调用时,每个都会被递归释放吗?
您知道的new和delete陈述是否有任何特定的奇怪技巧或警告?
Jam*_*lis 10
给定一个p动态分配对象的指针(),delete做两件事:
~MyClass()完成后,将调用类类型的任何成员变量的析构函数.它不会搜索对象的成员变量以获取其他指向free的指针; 它没有释放任何其他内存,也没有做任何其他事情.
如果你需要释放指向的内存intArray,你需要delete在析构函数中使用它MyClass.
但是,在几乎所有的C++代码中,您都不必担心这一点.您应该使用智能指针一样shared_ptr,unique_ptr,auto_ptr,和scoped_ptr自动管理动态分配的对象.手动资源管理最多是困难的,应尽可能避免.
这是更广泛的习语,范围限制资源管理(SBRM,也称为资源获取是初始化,或RAII)的一部分.这是迄今为止最重要的设计模式,可以在C++代码中随处理解和使用.
如果在你的课堂上你已经宣布了这个:
boost::scoped_ptr<int> intArray;
Run Code Online (Sandbox Code Playgroud)
然后当scoped_ptr<int>对象被销毁时,它将释放它所持有的指针.然后,您无需手动销毁对象.
在编写良好的现代C++代码中,您应该很少需要手动使用delete.应使用智能指针和其他SBRM容器来管理需要清理的任何类型的资源,包括动态分配的对象.
在第二个示例中,给出了一个如下链接列表:
x -> y -> z -> 0
Run Code Online (Sandbox Code Playgroud)
你会得到一个如下所示的操作顺序:
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]
Run Code Online (Sandbox Code Playgroud)
链表中的对象将以相反的顺序销毁.
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |