关于posix_memalign的一些问题

时间:2013-03-30 13:02:27

标签: c++ memory

我了解到您使用“new”在堆上创建了一个位置,并且必须在Windows操作系统上使用“delete”显式释放它。但现在我必须在Linux OS上这样做。我只是不知道。 例如

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

我应该为Linux操作系统做些什么?我想我应该使用posix_memalign,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

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

也许你的意思是:

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

这是有效的C ++(不是C,因为newdelete是C ++关键字,而不是C语言关键字)并且可以在Linux上运行,就像在Windows或任何标准C ++实现上一样。

然后,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];

但你应该有一些特别的理由想要一个对齐的指针(这里是1Kbyte的倍数)。通常,您不希望指针的对齐方式超过默认值。 (你可能需要一个大的对齐,例如,如果对指针的(intptr_t)强制转换进行算术运算;但这是非常不寻常的)。请注意placement new(由<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命令找出进程完成的许多系统调用。

答案 1 :(得分:1)

首先,new[]delete[]是C ++结构,而不是C。

它们可在任何兼容平台上使用,因此您可以在Linux上使用它们。

请注意,您的语法不正确。它应该是:

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

如果您使用C而不是C ++进行编码,则可以使用malloc()free()