我知道你在堆上用「new」創建一個地方,你必須在Windows操作系統上用「delete」明確釋放它。但現在我必須在Linux操作系統上執行此操作。我只是不知道。 例如有關posix_memalign的一些問題
char str[] = new char[512];
delete[] char;
我應該爲Linux操作系統做些什麼?我想我應該使用posix_memalign,但我不知道該怎麼做。
我知道你在堆上用「new」創建一個地方,你必須在Windows操作系統上用「delete」明確釋放它。但現在我必須在Linux操作系統上執行此操作。我只是不知道。 例如有關posix_memalign的一些問題
char str[] = new char[512];
delete[] char;
我應該爲Linux操作系統做些什麼?我想我應該使用posix_memalign,但我不知道該怎麼做。
首先,您的代碼既不是有效的C也不是有效的C++。
也許你的意思是:
char str* = new char[512];
delete[] str;
這是合法的C++(不是C,因爲new
和delete
是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
命令來查找進程完成的許多系統調用。
啊,我正在爲我的編譯器構建一個掃描器(實際上是作業^^)。我的教授說我們應該使用posix_memalign作爲我們的緩衝區。我認爲這是因爲它是linux標準。 – nomnom
按照老師的要求做。 'posix_memalign'不是Linux專用的,它在POSIX標準中定義。但幾乎沒有很好的理由需要一個基本對齊的緩衝區.... –
首先,new[]
和delete[]
是C++構造函數,而不是C.
它們可在任何兼容的平臺,這樣你就可以在Linux上使用它們。
請注意您的語法不正確。它應該是:
char *str = new char[512];
delete[] str;
如果你用C而不是C++的編碼,就可以使用malloc()
和free()
。
不,它是無效的... –
你究竟是怎麼偶然發現了'posix_memalign'尋找這個的? – delnan