带向量,指针的C++析构函数,

IST*_*STB 33 c++ destructor

据我所知,我应该在析构函数中销毁我创建的所有内容new并关闭打开的文件流和其他流.但是,我对C++中的其他对象有些怀疑:

  • std::vectorstd::strings:它们会自动销毁吗?

  • 如果我有类似的东西

    std::vector<myClass*> 
    
    Run Code Online (Sandbox Code Playgroud)

    指向类的指针.调用向量析构函数时会发生什么?
    它会自动调用析构函数myClass吗?或者只有矢量被破坏,但它包含的所有对象仍然存在于内存中?

  • 如果我有一个指向类中另一个类的指针会发生什么,比如说:

    class A {
      ClassB* B;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并且在代码中的某个点销毁A类.B类是否会被销毁,或者只是指针和B类仍将存在于内存的某个地方?

hmj*_*mjd 39

std :: vector和std :: strings:它们会自动销毁吗?

是(假设成员变量不是指向std::vectorstd::string).

如果我有像std :: vector这样的东西,那么在调用向量析构函数时会发生什么?它会自动调用myClass的析构函数吗?或者只有矢量被破坏,但它包含的所有对象仍然存在于内存中?

如果vector<MyClass>那么向量中包含的所有对象都将被销毁.如果vector<MyClass*>那么所有对象必须是显式的deleted(假设被破坏的类拥有该对象vector).第三种选择是vector智能指针,例如vector<shared_ptr<MyClass>>,在这种情况下,vector不需要明确地说明元素delete.

如果我有一个指向类中另一个类的指针会发生什么

B必须明确delete天.同样,智能指针可用于处理破坏B.


ElB*_*ulP 5

您只需要担心动态创建的内存(使用保留内存时)new

例如:

Class Myclass{
   private:
       char* ptr;
   public:
       ~Myclass() {delete[] ptr;};
}
Run Code Online (Sandbox Code Playgroud)