2009-12-18 4 views
4

다음은 다소 재미있는 C++ 코드이지만, 작동한다는 것을 알고 있습니다.무효 포인터 버퍼로부터의 구조체 인스턴스화

구조체가 정의되어 있으며 프로그램에서 void 포인터를 사용하여 메모리를 할당합니다. 그런 다음 구조체는 할당 된 버퍼를 사용하여 생성됩니다.

여기 코드는 더 많은 물건을 가지고 몇 가지 코드

typedef struct{ 
char buffer[1024]; 
} MyStruct 

int main() 
{ 
    MyStruct* mystruct_ptr = 0; 

    void* ptr = malloc(sizeof(MyStruct)); 

    // This is the line that I don't understand 
    mystruct_ptr = new (ptr) MyStruct(); 

    free(ptr); 

    return 0; 
} 

, 그러나 그것은 그것의 요점입니다.

이 코드는 테스트하지 않았지만 내가보고있는 코드는 매우 잘 테스트되고 작동합니다. 그러나 어떻게?

감사합니다.

편집 : 메모리 누수가 수정되었습니다.

+1

표시된 코드가 메모리를 누설합니다. 아마도 전체 프로그램에서 문제가되지는 않습니다. –

답변

0

Google에서 'placement new'를 검색하십시오.

11

이 주소는 placement new으로 미리 할당 된 버퍼 (주소를 지정 함)에 개체를 생성합니다.

편집 : 더 유용한 링크

2

이것은 새로운 배치입니다. 이는 실제로 메모리를 할당하는 대신 특정 주소를 반환하도록 new를 알려줍니다. 하지만 중요한 것은 여전히 ​​생성자를 호출하는 것입니다.

이 기술은 특정 메모리 주소에 개체를 만들어야 할 때 필요합니다.

5

그건 새로운 배치입니다. 어떤 생성자와 초기화도 필요하지만, 당신은 new을 할당하는 대신에 메모리를 공급하고 있습니다.

세부 사항은 이미 구조가 배치 새로운 것을 on this site.

1

를 제공하고 있습니다. 메모리를 할당하고 클래스 생성자를 호출하는 대신 컴파일러는 지정된 메모리 위치에 인스턴스를 생성합니다. 메모리 할당 및 할당 해제에 대한 이러한 종류의 제어는 장시간 실행되는 프로그램의 최적화에 대단히 유용합니다.

0

파일을 malloc 후에 읽었지만 새로운 파일 앞에 놓는다면 직렬화 된 버퍼에 미리 초기화 된 C++ 객체를 생성하기위한 일반적인 (그러나 추한) Load-In-Place 해킹을 수행 할 수 있습니다.