我不確定下面的代碼會導致任何內存泄漏?這段代碼能避免泄漏內存嗎?
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;
我不確定下面的代碼會導致任何內存泄漏?這段代碼能避免泄漏內存嗎?
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;
這很好。你有兩個分配和兩個釋放,匹配類型和匹配指針。你不會泄漏任何內存。
如果您的代碼運行完成,則沒有內存泄漏。如果有任何異常,那麼你會泄漏。
你泄漏如果行'a [0] = new char [m * n];'拋出。內存分配後執行的每個其他語句都是無丟包的。 –
我在VS2010上試過了,運行很好。 – RayZy
如果第二個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);
}
現在,析構函數保證代碼是否正常完成或拋出一個異常被調用,所以會有在任何情況下,不泄漏。
矢量容器給我們帶來了巨大的便利,我同意這一點,但是關於效率的代價,不是嗎? – RayZy
除非優化被禁用,或者您的實現非常糟糕,否則它應該和手動管理的數組一樣高效。我的代碼應該和你的行爲幾乎相同:兩個內存分配,'m'賦值和兩個釋放,所有的函數調用都應該內聯。異常安全可能需要花費,具體取決於如何管理異常情況,但是如果您嘗試修復泄漏,則會產生一些成本。 –
除非分配失敗並拋出異常。除非你真的需要它,否則不要不要使用手動分配。 –
如果你關心新投球的情況,那麼你是對的。我習慣了不投擲的嵌入式分配器,他們只是硬復位框:-) – user9876
這是真的,相當醜陋的代碼,我認爲,但我只是想確保這一劑量的工作 – RayZy