什么时候称为班级的攻击者
When does a destructor of a class is called ?
i有一个列表类,该类具有phead指针和典型的打印功能。我使用另一个函数(不是在列表类中),将上述列表称为其参数(非REF类型)并调用其打印功能。当我称其为"另一个函数"以打印列表时,它也会调用Destructor打印后的列表。应该这样吗?有人可以向我解释吗?
P.S:对不起,英语不好:P
当对象脱离范围时,destructor函数被称为:
- 功能结束
- 程序结束
- 一个包含本地变量结束的块
- 删除操作员称为
在您的案例中,destructor之所函数结束此新创建的对象从范围出现,因此被称为destructor。
编辑:扩展到答案;内存的三种主要类型
- 自动存储(堆栈)
- 动态存储(堆)
-
静态存储
- 如果您在>自动中分配一个对象,则一旦示波器终止,该对象将被破坏;例如
void foo() { MyClass myclass_instance; myclass_instance.doSomething(); }
在上述情况下,函数终止myClass_instance会自动破坏。
-
对象位于 dynamic 内存(堆)中。它们是新的,为了使dstructor被调用,您需要调用delete:
int main() { A* a = new A; delete a; //destructor called }
-
静态分配:对象位于静态内存中。无论分配哪里分配,程序结束时都会自动调用破坏者:
A a; //namespace scope int main() { }
在这里,当程序终止时,destructor被称为destructor。
如果对象达到其寿命的末端,即。
- 当控件到达其范围的末端(关闭卷曲括号)(对于具有自动存储持续时间的对象)
- 当您致电
delete
(或delete[]
)以分配给new
(或new[]
)的对象时(对于具有动态存储持续时间的对象) - 当父母被销毁时(对于班级成员对象)
- 当您手动删除用超载
new
操作员创建的对象时 - 当程序退出时(对于具有静态存储持续时间的对象)
根据您的解释,我想您是通过value 将其传递给它的。当功能达到其末尾时,对象的副本也达到其寿命范围的末端,因此其破坏者被称为自动称为。
例如(Case x
表示对象tx
在此处销毁):
struct T{
int a;
~T() { /* anything */ }
} t5;
struct U{
T t3;
};
void foo() {
T t1;
} // Case 1
int main() {
foo();
// Case 1
T *pt2 = new T();
delete pt2; // Case 2
{
U u1;
} // Case 3
void *buf = malloc(1000);
T *pt4 = new(buf) T();
pt4 -> ~T(); // Case 4
return 0; // Case 5
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 我不明白在这个例子中什么时候调用构造函数
- 如果真的需要std::move,我们应该什么时候声明右值refs
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- 程序什么时候会创建多个堆
- 调用boost.asio的异步函数时,线程是什么时候创建的
- Swig/python : 什么时候需要 SWIG_init() ?
- 什么时候称为班级的攻击者