在 c++ 中是否有指针的析构函数
Is there a destructor for a pointer in c++?
string * str=new string;
delete str;
当我删除指向对象的"str"时,是否调用了两个析构函数 - 一个用于指针本身,一个用于它指向的对象?
指针的析构函数会做什么?
delete
只是导致给定指针指向的对象被破坏(在本例中为string
对象(。指针本身,用 str
表示,具有自动存储持续时间,当它像任何其他局部变量一样超出范围时将被销毁。
但请注意,非类类型没有析构函数。因此,即使您将delete
与非类类型一起使用,也不会调用析构函数,但是当指针超出范围时,它会被销毁,就像任何其他自动变量通常发生的那样(意味着指针刚刚达到其生存期的终点,尽管指针指向的内存不会释放,直到您使用delete
显式释放它。
它本身的指针不会被 delete
语句破坏。 但与任何作用域变量一样,当作用域结束时,它已被销毁。
例:
void Function()
{
string * str=new string;
delete str; // <-- here the string is destructed
} // <-- here the pointer is "destructed", which is mean it's memory freed from the stuck but no actual destruction function is called..
析构函数的概念仅适用于对象(即用class
或struct
定义的实体(,不适用于普通类型,如指针。指针就像int
变量一样存在。
当我删除指向对象的"str"时,是否调用了两个析构函数 - 一个用于指针本身,一个用于它指向的对象?
不。 delete
采用指针参数。它销毁指向的对象(使用其析构函数,如果有的话,则不执行任何操作(,并解除分配指向的内存。您之前必须使用new
来分配内存并在其中创建对象。
指针本身不受影响;但它不再指向有效的对象,因此您不能对它执行任何操作。这有时被称为"悬空指针"。
指针的析构函数会做什么?
无。只有类类型具有析构函数。
指针的析构函数,如std::string*
示例,是微不足道的(就像其他基元类型的析构函数一样:int
、double
等(
智能指针类具有非平凡的析构函数,可以执行诸如释放资源、调整引用计数等操作。
我喜欢你从每个类型都有一个析构函数的概念中获得的简化。这样,即使该存储值的类型是int
或指针,您也不会对显式销毁存储值的模板产生心理故障:
template <class T> struct wrapper {
unsigned char data[sizeof(T)];
wrapper(T t) { ptr = new (data) T; }
~wrapper() { (T*)&data->~T(); } // ignore possible alignment problem
wrapper<int> i(3);
但是,int
s和指针的析构函数完全是微不足道的:它们不执行任何操作,并且没有地方可以查看析构函数的定义,因为该定义不存在。因此,可以合理地说他们没有析构函数。
无论哪种方式,当指针超出范围时,它就会消失;不会运行任何特殊代码。
- 优先顺序:智能指针和类析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 当指针在 cpp 17 中失去引用时,是否会调用非默认析构函数?
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 如何将析构函数分配给指针
- 智能指针析构函数争用条件
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 在C++中删除指针数组时析构函数崩溃
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 删除析构函数C++中的指针
- 构造函数是否unique_ptr初始化原始指针unique_ptr析构函数是否也删除关联的原始指针?
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 在析构函数内取消引用指针时出现分段错误
- 共享指针析构函数中的内存顺序
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- 在特殊情况下使析构函数不是虚拟的,并删除基指针是否安全
- 删除对象而不调用成员指针的析构函数
- 析构函数在与 STL 的共享指针中调用两次