-1

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

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

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

4

2 回答 2

3

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

也许你的意思是:

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

它是有效的 C++(不是 C,因为newanddelete是 C++ 关键字,而不是 C 关键字),并且可以在 Linux 上像在 Windows 或任何标准 C++ 实现上一样工作。

然后,str堆中分配 (在 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];

but you should have some particular reason to want an aligned pointer (here, a multiple of 1Kbyte). Usually you don't want pointer to be aligned more than the default. (You may require a large alignment, e.g. if doing arithmetic on (intptr_t) casts of your pointers; but this is very unusual). Notice the placement new (provided by the <new> standard header).

I recommend reading Advanced Linux Programming (which is more focused on C than on C++). And always compile on Linux with all warnings requested by the compiler and debugging info (e.g. g++ -Wall -g). Learn to use the gdb debugger and the valgrind memory leak detector. Once your program has no bugs, consider asking the compiler to optimize its produced object code with g++ -Wall -O2 instead of g++ -Wall -g.

actually, the real syscalls done by your application to the Linux kernel (whose list is on syscalls(2)) for memory management are mmap(2) and munmap(2) (and perhaps sbrk(2) which is nearly obsolete). You should use the strace command to find out the many syscalls done by a process.

于 2013-03-30T13:07:14.993 回答
1

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

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

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

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

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

于 2013-03-30T13:04:50.770 回答