먼저 코드가 유효하지도 C 유효한 코드도 아닙니다.
아마도 당신은 의미 : (new
및 delete
는 C++ 키워드가 아닌 C 것들이기 때문에,하지 C) 유효한 C++이며 Windows 또는 표준 C++ 구현처럼 리눅스에서 작동
char str* = new char[512];
delete[] str;
.
그러면 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];
하지만 당신은 여기에 (정렬 된 포인터를 원하는 몇 가지 특별한 이유는 1Kbytes의 배수가 있어야합니다). 일반적으로 포인터가 기본값보다 많이 정렬되는 것을 원하지 않습니다. (예를 들어 (intptr_t)
포인터를 캐스팅 할 경우 큰 정렬이 필요할 수 있지만 매우 드문 경우입니다.) placement new (<new>
표준 헤더에서 제공)을 확인하십시오.
Advanced Linux Programming (이는 C++보다 C에 중점을 둡니다)을 권장합니다. 그리고 컴파일러가 요청한 모든 경고와 디버깅 정보 (예 : g++ -Wall -g
)로 Linux에서 항상 컴파일하십시오. gdb
디버거와 valgrind
메모리 누수 감지기를 사용하는 방법을 익히십시오.프로그램에 버그가 없으면 대신 g++ -Wall -O2
을 사용하여 생성 된 개체 코드를 최적화하도록 컴파일러에 요청하는 것이 좋습니다.
실제로, 실제 syscalls 메모리 관리 (목록 syscalls(2) 켜짐) Linux kernel에 응용 프로그램에서하는 일 mmap(2) 및 munmap(2)
(거의 사용되지 않습니다 아마도 sbrk(2)
). 프로세스에 의해 수행되는 많은 syscall을 찾으려면 strace
명령을 사용해야합니다.
아니요, 유효하지 않습니다 ... –
어떻게이 지구를 찾고있는 'posix_memalign'에 비틀 거 렸니? – delnan