2013-11-04 4 views
6

, 나는 이상한 C++의 new 연산자의 사용을 발생?이상한 C++는 new 연산자 사용

+5

google "placement new"또는 다음 질문을 참조하십시오 : http://stackoverflow.com/questions/222557/what-uses-are-there-for -placement-new – Kos

+0

@Askyane 간단한 요약과 당신의 열람을위한 링크를 포함 시켰습니다. – GMasucci

답변

2

배치의 새로운 구문입니다. 메모리의 지정된 위치에 객체를 구성 할 수 있습니다. , 후자는 (그것의 X을 구성하지 않고)는 X을 유지하기에 충분한 메모리를 할당

#include <new> 

... 

void *buffer = ::operator new(sizeof(X)); 
X *p = new (buffer) X; 
... 
p->~X(); 
::operator delete(buffer); 

:

X *p = new X; 
... 
delete p; 

당신은 수행하여 같은 효과를 얻을 수 있습니다 새의 "정상적인"사용을 고려 할당 된 메모리에 X을 명시 적으로 구성합니다. 나중에, 명시 적으로 생성 된 X을 제거한 다음 해당 메모리를 포함하는 메모리를 할당 해제합니다. http://www.parashift.com/c++-faq/placement-new.html

2

new() 운영자가 size (바이트 크기)이 걸릴 수 nothrow_value이 나 pointer (이미 할당 된 메모리의 개체를 생성 (널 대신 bad_alloc 예외의 포인터를 반환) :

또한 C++ FAQ를 참조하십시오 이 포인터가 가리키고있다) 인수이며, 사용법에서는 arr이 가리키는 메모리 위치에 새로운 객체를 생성한다고 설명한다. 그것에 관해보기 흉하지 않은 가이드를 위해 나는 this link를 볼 것이다. 경우

당신은에서를 ClassA의 새로운 인스턴스를 생성하기 위해 편곡에 대한 포인터를 사용하고 인용했다.

2

이 구문은 placement new 구문이라고합니다. 일반적으로 미리 할당 된 버퍼에 객체를 생성하는 데 사용됩니다. 이것은 메모리 풀, 가비지 컬렉터를 구축 할 때 또는 성능 및 예외 안전성이 가장 중요한 경우 (메모리가 이미 할당되었으므로 할당 실패의 위험이 없으며 미리 할당 된 버퍼에 객체를 생성하는 데 시간이 덜 소요됨) . 이 시스템에 반환 올 때

char *buf = new char[sizeof(string)]; // pre-allocated buffer 
string *s1 = new (buf) string("test1"); // placement new 
string *s2 = new string("test2"); //ordinary new 

는 자동으로 마법을 수행 더 placement delete이 없습니다. 메모리 버퍼를 사용하는 모든 개체의 할당을 해제하면 안됩니다. 대신 각 객체를 수동으로 삭제 한 다음 [] 원래 버퍼 만 삭제하십시오

+2

나는 수동으로 각각의 객체를 파괴 한 다음 원래의 버퍼를 삭제한다는 것을 의미한다고 생각합니다. –

+1

@StuartGolodetz 그 어리석은 실수를해서 유감입니다. 그것을 바로 잡았다. – jester