2010-11-09 58 views
8

結構,我創建:C++如何刪除一個結構?

struct VideoSample 
    { 
     const unsigned char * buffer; 
     int len; 
    }; 

    VideoSample * newVideoSample = new VideoSample; 
    newVideoSample->buffer = buf; 
    newVideoSample->len = size; 

     //... 

現在怎麼到現在刪除了嗎?

+1

誰擁有*緩衝區*?賠率非零,你也需要一個析構函數。 – 2010-11-09 15:07:54

回答

20
delete newVideSample; 

這不會釋放任何內存,你儘管分配給newVideoSample->buffer - 你必須在刪除前明確釋放它。

//Free newVideSample->buffer if it was allocated using malloc 
free((void*)(newVideSample->buffer)); 

//if it was created with new, use `delete` to free it 
delete newVideSample->buffer; 

//Now you can safely delete without leaking any memory 
delete newVideSample; 

通常這種釋放是寫在類的destructor使時,會自動delete動態創建對象時,它就會被調用。

感謝@steve用於提吧:)

+0

fives me C2664免費(newVideSample-> buffer);線。就像它不能將const unsigned char轉換爲void * – Rella 2010-11-09 14:16:59

+1

這應該是-1 - 用於使用free,而不知道內存來自何處,並且如果指針已設置,則不建議在析構函數中執行此操作。不要低估,因爲沒有其他答案甚至提到這一點。 – 2010-11-09 16:46:40

+0

謝謝@Steve,更新了帖子。 – Amarghosh 2010-11-10 05:33:53

3

您正在尋找的delete關鍵字:

delete newVideoSample; 
2

除非我失去了一些東西,你只需要使用delete

delete newVideoSample; 
7
delete newVideoSample; 

但如果newdelete在同樣的情況下,你可能會更好過跳過他們,只是創建它在堆棧上,而不是:

VideoSample newVideoSample = {buf, size}; 

在這種情況下,不需要清理。

+1

默認情況下,不需要「新建」或「刪除」對象。只有當你真正知道你爲什麼需要它時才使用它。 – Nikko 2010-11-09 13:52:32

2

delete newVideoSample。 在C++ structclass相同,但具有默認公用字段。

3

delete newVideoSample;

但是,考慮使用smart pointer,將自動釋放內存,例如:

std::auto_ptr<VideoSample> newVideoSample(new VideoSample); 
+0

我會首先考慮「無指針」。 – Nikko 2010-11-09 13:53:53

2

使用delete

VideoSample * newVideoSample = new VideoSample; 
//.. stuffs 

delete newVideoSample; 

還有一個overloaddelete[]

VideoSample * newVideoSample = new VideoSample[n]; 
//.. stuffs 

delete [] newVideoSample; 

在Modern C++中,始終推薦使用智能指針。您可能需要使用boost庫中的boost::shared_ptr<T>

1

要分配 - > VideoSample * newVideoSample = new VideoSample;

刪除 - > delete newVideoSample;

如果您在相同的上下文中刪除對象,最好將它分配到堆棧上。 如果您在上下文之外刪除它,請不要忘記傳遞參考。如果您打算VideoSample釋放其buffer成員,那麼VideoSample是一個脆弱的P級

+0

「不要刪除,如果你即將退出程序,這是毫無意義的」**不。**爲什麼這是在+2?至少,明確地「刪除」是自我記錄和禮貌的。更甚的是,如果操作系統忽略刪除對象或_its_資源之一,該怎麼辦?此外,它可以確保您避免在內存泄漏分析儀等方面出現誤報。真的,刪除並不困難,所以請始終做。如果在[邪惡手指]「」「」不應該「」「重要的情況下開始避免疏忽,那麼當你忘記在它真正做到的情況下忘記」刪除「時,你會發出麻煩。 http://stackoverflow.com/q/677812/2757035 – 2016-02-16 19:01:49

2

而且最重要的是,不,如果你的即將退出過程中刪​​除,這是毫無意義的。無法知道buf是使用new[]還是malloc在堆中創建的,或者是堆棧中變量的地址。

2

在C++中,一個結構與一個類完全相同,除了默認情況下一切都是公共的,其中一個類默認是私有的。所以一個結構可以有一個析構函數並且可以通過刪除來釋放。

0

* *您創建Videosample的對象,所以你只需要使用刪除..

VideoSample * newVideoSample =新VideoSample; 刪除newVideoSample; * *