2017-12-22 25 views
-6

나는 C++ 메모리 할당 메커니즘을 알아 내려고하고있다. operator new()new 표현의 차이점을 이해합니다. 내가 here을 발견C++에서 new []와 new [] 사이의 차이점은 무엇입니까?

는하지만, operator new()operator new[]()의 프로토 타입은 거의 동일하며, operator new[]()의 기본 구현은 단순히 operator new()의 해당 버전을 호출해야합니다.

내 질문은 :

  1. 우리는 단순히 메모리의 크기를 할당하고 배열로 메모리를 사용하는 operator new() 기능을 사용할 수있는 경우, operator new[]()의 목적은 무엇인가?
    0x562ecf758e70::MyClass() 
    0x562ecf758e71::MyClass() 
    0x562ecf758e72::MyClass() 
    0x562ecf758e90::~MyClass() 
    0x562ecf758e8f::~MyClass() 
    0x562ecf758e8e::~MyClass() 
    0x562ecf758e8d::~MyClass() 
    0x562ecf758e8c::~MyClass() 
    0x562ecf758e8b::~MyClass() 
    0x562ecf758e8a::~MyClass() 
    0x562ecf758e89::~MyClass() 
    0x562ecf758e88::~MyClass() 
    0x562ecf758e87::~MyClass() 
    0x562ecf758e86::~MyClass() 
    0x562ecf758e85::~MyClass() 
    0x562ecf758e84::~MyClass() 
    0x562ecf758e83::~MyClass() 
    0x562ecf758e82::~MyClass() 
    0x562ecf758e81::~MyClass() 
    0x562ecf758e80::~MyClass() 
    0x562ecf758e7f::~MyClass() 
    0x562ecf758e7e::~MyClass() 
    0x562ecf758e7d::~MyClass() 
    0x562ecf758e7c::~MyClass() 
    0x562ecf758e7b::~MyClass() 
    0x562ecf758e7a::~MyClass() 
    0x562ecf758e79::~MyClass() 
    0x562ecf758e78::~MyClass() 
    0x562ecf758e77::~MyClass() 
    0x562ecf758e76::~MyClass() 
    0x562ecf758e75::~MyClass() 
    0x562ecf758e74::~MyClass() 
    0x562ecf758e73::~MyClass() 
    0x562ecf758e72::~MyClass() 
    0x562ecf758e71::~MyClass() 
    0x562ecf758e70::~MyClass() 
    *** Error in `/home/alec/.cpp-run/1/a.out': free(): invalid pointer: 0x0000562ecf758e68 *** 
    

    delete[]이 존재하지 않았다 (30) 오브젝트를 폭파하려고 않았다 밖으로이었다가 추락하기 전에 메시지 다음 그것은 인쇄

    struct MyClass { 
        MyClass() { cout << this << "::MyClass()" << endl;} 
        ~MyClass() { cout << this << "::~MyClass()" << endl;} 
    }; 
    
    int main() 
    { 
        MyClass *ptr = (MyClass *)::operator new[](sizeof(MyClass) * 3); 
        new (ptr) MyClass; 
        new (ptr+1) MyClass; 
        new (ptr+2) MyClass; 
        delete[] ptr; 
        return 0; 
    } 
    

    :

  2. 나는이 코드 조각을 시도 operator new[]()에 의해 할당 된 메모리? 또한 왜 충돌 했습니까?

+1

당신은 웹에 그 주제에 대한 단일 기사/블로그 게시물이 없다고 말합니까? –

+1

[좋은 C++ 서적 읽기] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) –

+1

뭐하고 있니? 내 제안은 당신이 이것에 대해 걱정하지 말고, 포인터 사용을 중지하고, 일반적인 객체를 사용하는 것입니다. 단일 객체가 필요하면'MyClass c'를 사용하고, 컨테이너를 원하면'std :: vector v'를 사용하십시오. 코드를 추측하는 것은 당신을 향상시키지 않을 것입니다. 간단히 시작하십시오. – Tas

답변

1

질문 1). operator new()operator new[]()의 기본 버전이 동일한 작업을 수행하더라도 프로그램이 operator new[]을 무시하고 make가 다르게 동작 할 수 있습니다. 그것은 커스터마이징 포인트입니다.

2 부).

(218)를 말하는 표준에 각주) 배열의 반복 횟수 또는 요소 크기를주의 할 operator new[] 또는 operator delete[]의 직접적인 책임이 아닌 있습니다. 이러한 연산은 배열 newdelete 표현식의 다른 위치에서 수행됩니다. 그러나 배열 new 표현식을 사용하면 보충 정보를 저장할 공간을 확보하기 위해 인수를 size으로 증가시킬 수 있습니다.

그래서 delete[]이 그것을 찾을 수 있도록 new Myclass[3] 어딘가에 3를 저장해야하지 않습니다 분명히 ::operator new[](sizeof(MyClass) * 3). 적어도 delete[]이 예상하는 곳이 아닙니다.

그래서 delete[]은 다른 숫자를 찾아 벽에 닿을 때까지 존재하지 않는 개체를 파괴합니다.