我了解到您使用“new”在堆上创建了一个位置,并且必须在Windows操作系统上使用“delete”显式释放它。但现在我必须在Linux OS上这样做。我只是不知道。 例如
char str[] = new char[512];
delete[] char;
我应该为Linux操作系统做些什么?我想我应该使用posix_memalign,但我不知道该怎么做。
答案 0 :(得分:3)
首先,您的代码既不是有效的C也不是有效的C ++。
也许你的意思是:
char str* = new char[512];
delete[] str;
这是有效的C ++(不是C,因为new
和delete
是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()
。