2013-07-09 752 views
1

我有下面的代码,正如我所知,在一个使用类构造函数的程序结束时,如果创建了某些对象,它们就会被销毁。由此判断,在执行结束时,我应该有一些“〜B()”和“〜D()”以特定的顺序打印出来,但是当我运行代码时,并没有发生这种情况。为什么?构造函数和析构函数

#include<iostream> 
#include<stdlib.h> 
using namespace std; 

class B{ 
public: 
    B(){cout<<"B()";} 
    virtual void print(){cout<<"b";} 
    ~B(){cout<<"~B()";} 
}; 

class D:public B{ 
public: 
    D(){cout<<"D()";} 
    void print(){B::print() 
    ;cout<<"d";} 
    ~D(){cout<<"~D()";} 
    }; 

void testI(){ 
    B* b[]={new B(),new D()}; 
    b[1]->print(); 
    B&c=*b[1]; 
    c.print(); 
} 



int main(){ 
    testI(); 
return 0; 
} 
+1

'delete'(和'B'需要'virtual'析构函数)在哪里? – hmjd

+1

因为您使用'new'创建对象而不是调用'delete'。尝试'int main(){B b; }' – juanchopanza

回答

3

您与new创建你的对象,这意味着它们在堆中分配,而不是堆有脱颖而出它是你删除它们。

B * b = new B(); 

后来..

delete b; 

编辑:

对于数组使用:

delete[] b; //if b is a pointer to an array of B's 
+0

我忘了堆,谢谢。 – Matt

0

您正在使用新的,而不删除对象动态分配内存空间。虽然您可以通过添加删除语句来解决此问题,但随着代码变得越来越复杂,您会发现手动内存管理可能会变得笨拙且容易出错。

使用自动内存管理类如std::unique_ptrstd::shared_ptr以及使用容器类如std::vector会更好。

void testI() 
{ 
    std::vector<std::shared_ptr<B>> b = {std::make_shared<B>(), std::make_shared<D>()}; 
    b[1]->print(); 
    B& c= *b[1]; 
    c.print(); 
} //b is destroyed here 
0

在常态:

3.6.1.5 -主return语句有离开的主要功能 (破坏具有自动存储时间的任何对象)

的影响

所以,在你的程序中,你创建了几个变量。当从主返回时,只有具有自动存储持续时间的那些被销毁。那些动态存储持续时间不是。对于具有动态存储持续时间的变量,您必须明确呼叫delete

这是一个小例子。在析构函数中放入一个断点并检查m_name值。

#include <iostream> 
#include <string> 

class A 
{ 
public: 
    A(const std::string &name):m_name(name){} 

    ~A() 
    { 
     std::cout<<"deleting "<<m_name<<std::endl; 
    } 

private: 
    std::string m_name; 
}; 

A a("Variable at namespace scope"); 

int main() 
{ 
    A a0("Automatic storage"); 
    A *a1 = new A("Dynamic storage 1"); 
    A *a2 = new A("Dynamic storage 2"); 
    delete a2; 
    static A a3("Static storage"); 

    return 0; 
} 
+0

当你从'main'(或者叫出口)返回时,具有静态生命期的对象也将被销毁。 –

+0

这里的目的不是这样,但你说得对,最好也要加。谢谢。 – Korchkidu

+0

@JamesKanze:编辑完成。我希望这是你的意思。 – Korchkidu

相关问题