2016-10-04 4 views
0

빠른 질문 :새로운 T [1]을 할 때 어떤 일이 벌어지고 있습니까? 여기

1.I 배열을 할당, 여분의 메모리가 들었 : 위의 코드에 따라서

template <class T> 
T* allocate(std::size_t n){ 
    return new T[n]; 
} 

, 우리는 new T[1]을하고있는 n==1, 그래서 나는이 걱정이 배열의 길이를 저장하는 데 사용됩니다 (확신 할 수 없음). new T[1]을 많이 사용하면 많은 양의 메모리가 낭비 될 수 있습니다.

2. delete[] 또는 간단히 delete을 사용하여 이것을 해제 할 수 있습니까?

답변

3
  1. 예, 전형적인 구현 만이 아닌 사소한 소멸자와 유형에 대한 몇 가지 여분의 메모리 배열의 정확한 길이를 저장해야합니다 new T[n]하지만 사용하는 경우.

    예. 일반적인 구현에서 new int[1]new int에 비해 메모리 오버 헤드가 없지만 new std::string[1]new std::string에 비해 메모리 오버 헤드가 있습니다.

    추가 메모리는 추가 size_t 필드입니다. 즉, 할당 된 개체의 크기에 따라 백분율이 달라집니다. sizeof(T)sizeof(size_t)과 비슷하면 오버 헤드가 상당 할 수 있습니다.

    하지만 모두 구현 관련 메모리 할당 메커니즘의 추가 세부 정보에 의존 할 수도 있습니다.

    즉,이 코드가 응용 프로그램 특정 코드의 일부라면 시도해보고 프로그램의 메모리 소비에 부정적인 영향을 미치는지 확인하는 것이 좋습니다. 어쩌면 전혀 문제가되지 않을 수도 있습니다. 그러나 일반적인 라이브러리를 작성하는 경우에는주의를 기울일만한 가치가 있습니다.

  2. 예, delete []을 사용해야합니다.

+0

그래서'n == 1'에 대한 if 문이 라이브러리로 권장됩니까? '알맞은'할당자가이 문제를 어떻게 처리할까요? – YiFei

+0

@YiFei :'if (n == 1) '을 사용하여 할당 할 때'new'와'new []'사이를 전환하면'delete'와'delete' 사이를 전환해야합니다 []'을 사용하여 삭제 시점에서 같은'if (n == 1)'. 이를 위해 당신은 어딘가에서'n '을 독립적으로 저장해야 할 것입니다. 이것은 같은 값의'n '에 대해 많은 배열을 할당하지 않으면 (즉, 많은 수의 배열에 대해 하나의'n'을 저장하는 경우가 아니라면)이 모든 것을함으로써 얻을 수있는 모든 절약을 희석 할 (또는 닦아 낼 가능성이 있습니다) . – AnT

+0

바로 지금, allocator에 대한 개념을 새롭게 한 것처럼 보였습니다. deallocate에는 다른 매개 변수가 필요합니다. 감사:) – YiFei

2
  1. RAM이 쌉니다. 모든 프로그램이 항상 1 오브젝트의 배열을 계속해서 할당한다면, 이것은 사실 약간 낭비 일 것입니다. 그러나 1 요소 배열을 때때로 할당하는 것은 세계의 끝이 될 수 없습니다.

  2. delete[]을 사용하십시오. new[]을 사용한 경우 delete[]을 사용해야합니다. 얼마나 많은 것이 중요합니까? new ed. 이것은 상당히 잘린 규칙입니다. 예외 없음.

0
  1. 없음 메모리는 배열의 길이를 저장하는 데 사용되지 않습니다, 또는 적어도 어떤 메모리를 사용하면 액세스가 허용되지 않습니다. 메모리를 부여한 메모리 관리자에게는 숨겨진 부기가있을 수 있습니다. 이 부기를 찾아야한다면, 그냥 두십시오. 당신이하는 일은 확실히 휴대 할 수 없습니다. 또한 고정 크기 블록으로 메모리를 제공받을 수도 있습니다. 적어도 T 크기의 블록이 제공됩니다. 이 블록에있는 여분의 메모리는 효과적으로 낭비됩니다.
  2. new[]으로 할당 된 항목은 모두 delete[]과 함께 릴리스해야하며 그렇지 않은 경우 정의되지 않은 동작이 호출됩니다. 다시 한번, 저수준 메모리 관리자를 망치지 마십시오.
+0

'delete '연산자가 배열의 첫 번째 요소, 즉 직접 가리키는 포인터를 지우고'new T [1]'이 리턴하는 (전체 배열) ? (결코 시도하지 않겠지 만 ...) '부기'와 관련이 있습니까? – YiFei

+0

무슨 일이 일어날 지 명확한 답은 없습니다. C++ 표준은이 문제를 피하기 때문에 컴파일러가 전체 우주, 'T'를 정확히 원하는대로 또는 그 중간에있는 모든 것을 삭제하는 코드를 생성하는 것이 완벽하게 허용됩니다. 컴파일러가 아무 것도하지 않거나 모욕적 인 주장을 콘솔에 출력하는 것은 유효합니다. – user4581301

+0

표준은이 문제를 피하지 않으며, 그것은 명백히 불법이라고 말합니다 ([new.delete.single]/12). – ildjarn