C 11 사양에서는 라이브러리 함수를 참조하는 식을 포함하여 모든 배열 새 식에서 지정되지 않은 오버헤드가 발생할 수 있다고 명시합니다. 연산자 new[](std::size_t, void*) 및 기타 배치 할당 함수. 이 오버헤드는 new를 호출할 때마다 달라질 수 있습니다.
예를 고려하세요.
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
사양에 따르면 new(버퍼) std::string[10]은 연산자 new[를 호출합니다. ](sizeof(std::string) * 10 y, buffer), 여기서 y는 음이 아닌 지정되지 않은 오버헤드 값입니다. y > 0이면 미리 할당된 버퍼가 부족합니다.
표준에서 y 오버헤드 값을 정확하게 결정하는 것은 불가능합니다. 따라서 플랫폼 구현에 대한 구체적인 지식이 없으면 new[](std::size_t, void* p) 연산자를 사용하지 않는 것이 좋습니다.
pre와 함께 배열 배치-new를 사용해야 하는 경우 -할당된 버퍼를 사용하면 오버헤드를 동적으로 확인하는 새로운 배치 배열 새 함수를 만들 수 있습니다.
inline void* operator new[](std::size_t n, void* p, std::size_t limit) { if (n <= limit) std::cout << "life is good\n"; else throw std::bad_alloc(); return p; } int main() { alignas(std::string) char buffer[100]; std::string* p = new(buffer, sizeof(buffer)) std::string[3]; }
배열 크기를 변경하고 n 값을 검사하여 다음을 수행할 수 있습니다. 귀하의 플랫폼에 대한 y 오버헤드를 추론해 보세요.
위 내용은 C 11 배열 배치-새 표현식으로 인해 지정되지 않은 오버헤드가 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!