다음과 같은 예를 생각해수명이 끝나면 개체 저장소를 암시 적으로 또는 명시 적으로 다시 사용할 수 있습니까?
// create some storage
alignas(int) char buffer[2 * sizeof(int)];
// new object of type int at the storage of buffer, the int pointed
// to by p begins its lifetime here, buffer's lifetime is over
int* p = new (buffer) int{42};
// some entirely unrelated int
int j = 17;
은 buffer
의 끝에서 다른 스토리지, 이미 새로운 int
객체에 의해 사용 p
가 가리키는되지 않은 부분에 대한 허용인가를받는 재개한다 자동 저장 기간의 후속 객체에 의해 암시 적으로 재사용됩니까? 즉, 준수 구현에 &j == p+1
이 허용 되었습니까?
는 이와 관련, 것 명시 적으로는 다른 저장이 잘 정의 된 행동이 될 재사용? 이다
alignas(int) char buffer[2 * sizeof(int)];
int* p = new (buffer) int{42};
int* q = new (p+1) int{6};
는 모두 int
들 p
과 수명에서 여전히 q
가 가리키는입니까?
(as-if 규칙을 통해) 허용되지 않지만 완료되지 않았습니다. 스택 포인터를 이동하는 것이 힙에서보다 훨씬 쉽습니다. – OMGtechy
왜 '버퍼'수명이 끝났다고합니까? – Erik
컴파일러가 응용 프로그램에서 'p + 1 '을 사용하지 않는다는 것을 증명할 수 있다면, 그 메모리를 사용했다면 (UB 포인터 비교를하는 것 이외에) 어떻게 알 수 있습니까? – hyde