어레이에 사용할 때 이식성있는 코드에서 새로운 배치를 실제로 사용할 수 있습니까?어레이의 새로운 배치를 이식 가능한 방식으로 사용할 수 있습니까?
새로운 []에서 가져온 포인터가 전달하는 주소와 항상 같지는 않습니다 (5.3.4, 표준에서 12 참고가 올바른지 확인하는 것처럼 보입니다) 이 경우 어레이가 들어갈 버퍼를 어떻게 할당 할 수 있는지보십시오.
다음 예제에서는 문제를 보여줍니다. 비주얼 스튜디오 컴파일이 예는 메모리 손상 결과
#include <new>
#include <stdio.h>
class A
{
public:
A() : data(0) {}
virtual ~A() {}
int data;
};
int main()
{
const int NUMELEMENTS=20;
char *pBuffer = new char[NUMELEMENTS*sizeof(A)];
A *pA = new(pBuffer) A[NUMELEMENTS];
// With VC++, pA will be four bytes higher than pBuffer
printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
// Debug runtime will assert here due to heap corruption
delete[] pBuffer;
return 0;
}
메모리에서 찾고, 컴파일러는 항목 수의 카운트를 저장하는 버퍼의 처음 4 바이트를 사용하는 것으로 보인다. 즉, 버퍼는
sizeof(A)*NUMELEMENTS
만큼 커야하므로 배열의 마지막 요소는 할당되지 않은 힙에 기록됩니다.
따라서 배치 []를 안전하게 사용하기 위해 구현에서 얼마나 많은 추가 오버 헤드가 필요합니까? 이상적으로는, 다른 컴파일러간에 이식 할 수있는 기술이 필요합니다. 적어도 VC의 경우, 오버 헤드는 클래스마다 다를 수 있습니다. 예를 들어, 예제에서 가상 소멸자를 제거하면 new []에서 반환 된 주소는 내가 전달한 주소와 동일합니다.
아아 저주.귀하의 질문에 속아 : ([배열 배치 - 새로 버퍼에 지정되지 않은 오버 헤드가 필요합니다?) (http://stackoverflow.com/questions/8720425/array-placement-new-requires-unspecified-overhead-in-the -buffer) –
흠 ... 가상 소멸자를 제거 할 때 오버 헤드가 사라지면 오버 헤드가 클래스 'vtable 또는 VStudio의 RTTI 구현에서 발생할 가능성이 높습니다. –
또는 적어도 오버 헤드는 클래스가 중요하지 않은 소멸자를 가지고있는 경우에만 오버 헤드가 사용되는 것일 수도 있습니다 .. –