2013-03-30 42 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()