2013-07-09 592 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

相關問題