2012-09-10 96 views
0

我在C新型++(即時通訊使用的Visual Studio 2010旗艦版),我有一個問題要摧毀一類有一個std ::名單,我的代碼是:C++列表類VS2010終極

#include "p_list.h" 

int main(){ 
    p_list uno; 
    uno.~p_list(); 
    return 0; 
} 

和類P_LIST是:

#pragma once 
#ifndef LISTADO_H 
#define LISTADO_H 
#include <list> 
using namespace std; 
class p_list 
{ 
public: 
    list<int> first; 

    p_list(void); 

    ~p_list(void); 
}; 

#endif 

當我執行代碼顯示該錯誤

http://imageshack.us/photo/my-images/51/dibujopfw.jpg/

我不明白爲什麼,如果一個變化的std ::名單的標準::載體,代碼執行完美......但我NEAD一個std ::列表

thnxs

+1

你很少會需要自己調用析構函數類的。在這種情況下,當'uno'超出範圍時會調用它。您間接調用它的最常見時間是使用'delete',但這已經過時了。從你的課堂細節來看,提供一個明確的析構函數似乎也毫無意義。你也可以在頭文件的全局命名空間中使用'namespace std;',這是沒有人使用該頭文件必須處理的。最後,'#pragma Once'和標準頭文件守護程序都做同樣的事情,但後者是標準C++的一部分。我會選擇一個並堅持下去。 – chris

+6

教科書中的「超越它」的情況。 C++實際上比人們想象的要容易得多... –

+0

嗯,我不應該說頭文件是一種語言特性,而是'#pragma once'不是。我猜標題衛兵只是你可以使用沒有擴展名的東西。 – chris

回答

2

名單有automatic storage並會被摧毀的範圍退出:

#include "p_list.h" 

int main(){ 
    p_list uno; 
    return 0; 
} // destructor is called on scope exit 

通過手動調用析構函數,你挑起企圖摧毀目標的兩倍。

+0

是的,但它會在末尾顯示的錯誤 – Etori

+0

@ user1661182錯誤必須是由於其他原因。你真的不必在這裏調用析構函數。 – juanchopanza

+2

@ user1661182:你在析構函數中調用'first。〜list()是否犯了錯誤? – GManNickG

2

你已經手動調用了析構函數,然後當退出main()函數時,析構函數會被自動調用一次。

我們沒有p_list.cpp;可以在那裏刪除兩次?

+0

代碼在CPP是的:#include 「p_listado.h」 p_listado :: p_listado(無效){ } p_listado ::〜p_listado(無效){ \t } – Etori

0

uno將被分配在堆棧上。這也意味着當它超出範圍時,它的析構函數將自動調用。你不需要(而不應該)手動調用它。

對於類中的成員變量也是如此。如果它們沒有被分配到堆上,那麼當類的析構函數被調用時,它們的析構函數會被調用。

你可以看到自己這一點,如果你把打印語句構造函數和析構函數中:

#include "listado.h" 
#include <iostream> 
p_list::p_list(void) 
{ 
    std::cout<<"plist constructor called\n"; 
} 

p_list::~p_list(void) 
{ 
    std::cout<<"plist destructor called\n"; 
} 

接下來,刪除任何手動調用P_LIST的析構函數,像juanchopanza曾建議,觀析構函數被調用自動。

如果listado.cpp文件僅包含構造函數和析構函數,將其刪除,並使用此:

#pragma once 
#ifndef LISTADO_H 
#define LISTADO_H 
#include <list> 
using namespace std; 
class p_list 
{ 
public: 
    list<int> first; 

    p_list(void){}; 

    ~p_list(void){}; 
}; 

#endif 
+0

感謝您的幫助,但是當註釋uno。〜p_list,錯誤也顯示。請注意,當我使用Vector而不是List時,程序運行良好 – Etori

+0

您可以發佈您用於p_list方法的代碼嗎? – Carl

+0

即時通訊不使用任何方法,因爲我試圖集中問題的範圍,本身我創建一個新的proyect(你可以看到的proyect)在哪裏是必要的代碼來顯示錯誤(並沒有更多的代碼) – Etori