2013-03-30 100 views
-1

我知道你在堆上用「new」創建一個地方,你必須在Windows操作系統上用「delete」明確釋放它。但現在我必須在Linux操作系統上執行此操作。我只是不知道。 例如有關posix_memalign的一些問題

char str[] = new char[512]; 
delete[] char; 

我應該爲Linux操作系統做些什麼?我想我應該使用posix_memalign,但我不知道該怎麼做。

+0

不,它是無效的... –

+5

你究竟是怎麼偶然發現了'posix_memalign'尋找這個的? – delnan

回答

3

首先,您的代碼既不是有效的C也不是有效的C++。

也許你的意思是:

char str* = new char[512]; 
delete[] str; 

這是合法的C++(不是C,因爲newdelete是C++的關鍵字,而不是C的),並因爲它在Windows或任何標準的C++實現在Linux上工作。

然後,str被分配在heap中(並且同一個程序在Windows和Linux上分配在堆上)。

在你的情況下,不需要posix_memalign(3)(請看我剛剛鏈接的手冊頁)。

如果出於某種特定的原因,您希望使用posix_memalign指針要對齊,例如,是1024的倍數。

這個例子很有意思,因爲它要求512字節的內存區域的1024個字節對齊。

然後請有

#define _GNU_SOURCE 
#include <new> 
#include <stdlib.h> 

,後來在同一個C++源文件:

char* str = NULL; 
void* ad = NULL; 
if (posix_memalign(&ad, 1024, 512)) 
    { perror("posix_memalign failed"); exit (EXIT_FAILURE); } 
str = new(ad) char[512]; 

,但你應該有一些特別的理由要對齊的指針(這裏,1K字節的倍數)。通常,您不希望指針比默認對齊。 (您可能需要大量對齊,例如,如果對(intptr_t)指針進行算術運算,但這非常不尋常)。請注意0​​(由<new>標準標題提供)。

我推薦閱讀Advanced Linux Programming(它比C++更注重C)。並且始終在Linux上編譯,並提供編譯器和調試信息所要求的所有警告(例如g++ -Wall -g)。學習使用gdb調試器和valgrind內存泄漏檢測器。一旦程序沒有錯誤,可以考慮讓編譯器使用g++ -Wall -O2而不是g++ -Wall -g來優化其生成的目標代碼。

實際上,真正的syscalls您的應用程序到Linux kernel(其名單上syscalls(2))對內存管理進行的mmap(2)munmap(2)(也許sbrk(2)這是近過時)。您應該使用strace命令來查找進程完成的許多系統調用。

+0

啊,我正在爲我的編譯器構建一個掃描器(實際上是作業^^)。我的教授說我們應該使用posix_memalign作爲我們的緩衝區。我認爲這是因爲它是linux標準。 – nomnom

+1

按照老師的要求做。 'posix_memalign'不是Linux專用的,它在POSIX標準中定義。但幾乎沒有很好的理由需要一個基本對齊的緩衝區.... –

1

首先,new[]delete[]是C++構造函數,而不是C.

它們可在任何兼容的平臺,這樣你就可以在Linux上使用它們。

請注意您的語法不正確。它應該是:

char *str = new char[512]; 
delete[] str; 

如果你用C而不是C++的編碼,就可以使用malloc()free()