2015-09-04 85 views
0

標題可能會令人困惑。這是一件簡單的事情,但我已經搜索並嘗試了一個小時。我已經嘗試了我發現的一切。C++刪除什麼wchar_t *指向

代碼:

void test() { 


// Convert 
wchar_t* wcBuff; 
wstring value = convert::stringToWideChar(str); 
wcBuff = (wchar_t*)value.c_str(); 

// Draw Text 
g->DrawString(wcBuff,...); 

// Clean 
delete wcBuff; 


} 

的刪除導致程序崩潰。

+0

我之前沒有使用'wstring',但是您確定需要將'c_str'返回嗎? –

+0

@Neil Kirk是的,沒有它,這是在下面的行上的錯誤:'[錯誤]從類型'std :: wstring {aka std :: basic_string }'轉換爲類型'wchar_t *'' –

+0

'wcBuff = value.c_str();' –

回答

3

不要明確刪除wcBuff。它指向屬於value的內存,並且在value超出範圍時將被刪除。

考慮以下代碼:

#include <cstdlib> 

class alloc 
{ 
    char* memory; 

public: 
    alloc() { memory = static_cast<char*>(std::malloc(32)); } 
    char* get_buff() { return memory; } 
    ~alloc() { std::free(memory); } 
}; 

int main() 
{ 
    alloc x; 
    char* y = x.get_buff(); 

    delete y; 
} 

在這個例子中,alloc類使用以外new/delete分配和解除分配存儲器(舊的C的功能,在這種情況下)的機制。在main中調用delete y會導致崩潰。由於main是函數,並且x被分配爲函數的局部變量之一,所以當main退出時將調用x.~alloc(),釋放x擁有的存儲器。

+0

代碼在一個函數內,那麼函數將在它結束之前清理? –

+0

我已經編輯了答案來澄清。 –

+0

你正在發現RAII的樂趣。 'alloc'對象'x'自動創建並銷燬。至於'y'?這是'alloc'中緩衝區的淺表副本,所以只要有人刪除它,緩衝區就會失效。幸運的是,'y'的範圍與'x'的範圍相同,因此它們都將同時被刪除。但是,這意味着你不能返回'y',因爲它實際上是一個指向臨時變量的指針。如果你需要一個智能指針,當最後一個副本被銷燬時會立即刪除內存,而不是之前,這裏有'smart_ptr'。 – Davislor

1

您從.c_str()獲取的內存緩衝區由wstring本身管理。你不應該釋放它。它被wstring的析構函數釋放。

同樣,只有使用新運算符分配的指針纔可以使用刪除運算符來釋放。作爲一個C字符串,它可能是使用malloc()分配的內存,它是由free()獲取的。但這是您的標準庫的實現細節。只是不要自行釋放內存。

+0

該代碼在函數內部,在函數結束之前是否仍然清理乾淨? –

+0

在值超出範圍之前,它不會被釋放。當值超出範圍時,調用wstring的析構函數來釋放內存值。如果你想確保它被釋放,然後你可以將它應該在大括號中有效。但是在大多數情況下,你不需要擔心這一點。 –

2

你不能自己釋放記憶,因爲你沒有自己分配它。

(wchar_t*)value.c_str()語句返回一個指針由wstring擁有的,將被自動釋放內存的destructor當函數結束時(value超出範圍)。