我知道你在堆上用“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