2011-08-05 76 views
0

我不確定下面的代碼會導致任何內存泄漏?這段代碼能避免泄漏內存嗎?

char **a; 
a = new char* [m]; 
a[0] = new char[m * n]; // allocate all need 
for(int i=1; i<m; i++) 
{ 
a[i] = a[i-1] + n;//allocate every pointer 
} 
delete[] a[0]; 
delete[] a; 

回答

3

這很好。你有兩個分配和兩個釋放,匹配類型和匹配指針。你不會泄漏任何內存。

+2

除非分配失敗並拋出異常。除非你真的需要它,否則不要不要使用手動分配。 –

+0

如果你關心新投球的情況,那麼你是對的。我習慣了不投擲的嵌入式分配器,他們只是硬復位框:-) – user9876

+0

這是真的,相當醜陋的代碼,我認爲,但我只是想確保這一劑量的工作 – RayZy

4

如果您的代碼運行完成,則沒有內存泄漏。如果有任何異常,那麼你會泄漏。

+0

你泄漏如果行'a [0] = new char [m * n];'拋出。內存分配後執行的每個其他語句都是無丟包的。 –

+0

我在VS2010上試過了,運行很好。 – RayZy

1

如果第二個new失敗,那麼它會拋出一個異常,並且第一個分配不會被刪除,從而泄漏。

避免這種情況的最好方法是使用資源管理類,而不是手動管理內存。在這種情況下,std::vector將是最好的:

std::vector<char> memory(m * n); 
std::vector<char*> pointers; 

pointers.reserve(m); 
pointers.push_back(&memory.front()); 
for (int i = 1; i < m; ++i) { 
    pointers.push_back(pointers.back() + n); 
} 

現在,析構函數保證代碼是否正常完成或拋出一個異常被調用,所以會有在任何情況下,不泄漏。

+0

矢量容器給我們帶來了巨大的便利,我同意這一點,但是關於效率的代價,不是嗎? – RayZy

+0

除非優化被禁用,或者您的實現非常糟糕,否則它應該和手動管理的數組一樣高效。我的代碼應該和你的行爲幾乎相同:兩個內存分配,'m'賦值和兩個釋放,所有的函數調用都應該內聯。異常安全可能需要花費,具體取決於如何管理異常情況,但是如果您嘗試修復泄漏,則會產生一些成本。 –