2013-03-30 4 views
-1

"new"로 힙에 장소를 만들고 Windows OS에서 "delete"로 명시 적으로 해제해야한다는 것을 알았습니다. 하지만 지금은 리눅스 OS에서해야만합니다. 나는 전혀 모른다. posix_memalign에 대한 몇 가지 질문

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

나는 리눅스 OS를 위해 무엇을해야합니까 예를

에 대한 ? posix_memalign을 사용해야한다고 생각하지만 어떻게해야할지 모르겠다. 모든

+0

아니요, 유효하지 않습니다 ... –

+5

어떻게이 지구를 찾고있는 'posix_memalign'에 비틀 거 렸니? – delnan

답변

3

먼저 코드가 유효하지도 C 유효한 코드도 아닙니다.

아마도 당신은 의미 : (newdelete는 C++ 키워드가 아닌 C 것들이기 때문에,하지 C) 유효한 C++이며 Windows 또는 표준 C++ 구현처럼 리눅스에서 작동

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

.

그러면 strheap에 할당됩니다 (동일한 프로그램이 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 명령을 사용해야합니다.

+0

아, 나는 내 컴파일러를위한 스캐너를 만들려고 노력하고있다. (사실 숙제 ^^). 우리 교수는 우리 버퍼에 posix_memalign을 사용해야한다고 말했다. 나는 그것이 리눅스 표준이기 때문에 그것이라고 생각했다. – nomnom

+1

교사가 요구하는대로하십시오. 'posix_memalign'은 리눅스에만 한정되지 않고 POSIX 표준에 정의되어 있습니다. 그러나 크게 정렬 된 버퍼를 필요로하는 좋은 이유는 거의 없습니다 .... –

1

먼저, new[]delete[]는 C++ 구조이며,하지 C.

그들은 호환되는 모든 플랫폼에서 사용할 수 있습니다, 그래서 당신은 리눅스에서 사용할 수 있습니다.

구문이 올바르지 않습니다. 그것은해야한다 : 당신은 C보다는 C++로 코딩하는 경우

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

, 당신은 malloc()free()를 사용할 수 있습니다.