Foo* foo1 = static_cast<Foo*>(alloca(sizeof(Foo) * numTargets));
new (foo1) Foo(); // Statement 1: Calls constructor Foo()
Foo** foo2 = static_cast<Foo**>(alloca(sizeof(Foo*) * numTargets));
new (foo2) Foo*(); // Statement 2: Doesn't calls constructor Foo()
현재 프로젝트에서 문장 1 & 2가 없습니다.alloca에 의해 반환 된 포인터의 인덱스 기반 액세스와 "placement new"의 효과
성명 1을 가지고 있지 않으면 foo1[i]
에 값을 채우려는 시도가있을 때 (버그) 인 경우 이 충돌합니다. 나는 진술 # 1을 도입함으로써 그것을 고쳤다. 그러나 나는 몇 가지에 대해 확실하지 않다 :
- 나는
new (foo1) Foo[numTargets ];
대신 new (foo1) Foo();
의 사용해야 나는 미래의 버그에 대해 safegaurding에 대한 문 # 2를 도입해야 하는가? 진술 # 2는 실제로 어떤 영향을 미칩니 까?- 성명서 # 1이 충돌을 방지하는 데 어떻게 도움이됩니까?
- 두 경우 모두 메모리 누수가 있습니까? 두 경우 모두 명시 적으로 소멸자를 호출해야합니까?
관련성이 매우 높습니다. http://stackoverflow.com/questions/8720425/array-placement-new-requires-unspecified-overhead-in-the-buffer – StoryTeller