2011-01-10 87 views
1

更新(已解決):好的,我是完整白癡!在主程序中的「用數據做東西」部分中,我最終增加了指針,所以刪除顯然不起作用! D'哦!刪除在另一個共享庫中分配的指針

所以我編有一個類似的功能(超級簡化視圖)共享庫,該庫在還地雷,所以我知道數據是如何分配的:

// inside library 

void* getData(int size) { // with other parameters 

    UINT8* data = new UINT8[size]; // where typedef uint8_t UINT8; for gcc 

    // do a socket read, where data is the buffer 
    blockingRead (someSocket, data, propertySize); 

    return (void*) data; 
} 

它返回一個void指針,因爲數據可能是一個結構體(所以可以轉換爲結構體)。

問題是,我在我的主程序中使用了這個指針,我想在完成時刪除它。如果我這樣做,我的主要程序:

// inside main program 
char* data = (char*) Library::getData(5); 
// do stuff with data 

delete[] data; // crashes with: 
// *** glibc detected *** core: free(): invalid pointer: 0x00002aaab007bca4 *** 

我想,也許我應該在共享庫中刪除,而不是:

// inside library 

void disposeData(void* data) { // call this from main program 
    delete[] (UINT8*) data; // cast it back to the original type of pointer 
} 

但我仍然得到同樣的崩潰!一切工作正常,如果我不刪除,但我不希望不必要的內存泄漏遍及我的程序。

我可能在某處做某事愚蠢 - 請幫助我找到我的方式錯誤!

編輯:正如在評論中指出的,似乎上述代碼的作品 - 我將不得不看看是什麼具體導致我的代碼中的錯誤。

+1

我認爲你需要創建一個展示你的問題的最小例子。我用g ++試過你的代碼,它運行得很好......沒有崩潰。 – 2011-01-10 21:49:56

回答

0

如果庫爲您提供分配的指針,它應該解釋如何釋放它們。它可以提供它自己的釋放功能。除非您擁有庫的源代碼,並且可以驗證它是否使用new[]來創建指針,否則無法確定它是如何分配內存的。您的崩潰可能是因爲您的釋放器與其分配器不匹配。

0

如何使用更多基於RAII的設計,如智能指針? Boost智能指針設計得非常好。

2

您是否嘗試過使用valgrind?使用valgrind將幫助您查明各種各樣的內存管理錯誤,這可能是導致問題的原因。你看到的錯誤看起來像是堆腐敗(就像@nos說的,可能在做東西的一部分),或者你實際上並沒有釋放你最初分配的同一個對象。

0

我敢打賭,你正在做這樣的事情,你提到「強制轉換」:

#include <stdio.h> 

class B { int x; }; 

class C { int y; }; 

class A : public B, public C { }; 

void* getData() 
{ 
    A* a = new A(); 
    printf("%p\n", a); 
    C* c = a; 
    printf("%p\n", c); 
    return c; 
} 

void deleteData(void* x) 
{ 
    // delete (A*)x; // incorrect; causes crash 
    delete (A*)(C*)x; // correct 
} 

int main() 
{ 
    void* x = getData(); 
    deleteData(x); 
    return 0; 
} 

當心,編譯器可轉換看起來像一個無辜鑄入指針運算在你的背後。