Program Tip

C ++에서 어떻게 'realloc'을 사용합니까?

programtip 2020. 10. 12. 08:03
반응형

C ++에서 어떻게 'realloc'을 사용합니까?


reallocC ++에서 어떻게 할 수 있습니까? 그것은 언어에서 누락 된 것 같다 -이 newdelete있지만 resize!

내 프로그램이 더 많은 데이터를 읽을 때 버퍼를 다시 할당해야하기 때문에 필요합니다. 나는 delete이전 포인터 new를 사용하고 새롭고 더 큰 포인터를 사용 하는 것이 올바른 옵션 이라고 생각하지 않습니다 .


:: std :: vector를 사용하십시오!

Type* t = (Type*)malloc(sizeof(Type)*n) 
memset(t, 0, sizeof(Type)*m)

된다

::std::vector<Type> t(n, 0);

그때

t = (Type*)realloc(t, sizeof(Type) * n2);

된다

t.resize(n2);

포인터를 함수에 전달하려면 대신

Foo(t)

사용하다

Foo(&t[0])

벡터는 스마트 C-array이기 때문에 절대적으로 정확한 C ++ 코드입니다.


올바른 옵션은 아마도 당신을 위해 일하는 컨테이너를 사용하는 것 std::vector입니다.

new그리고 delete그들이 지정된 형식의 개체를 유지하기에 충분한 메모리를 할당하기 때문에, 크기를 조정할 수 없습니다. 주어진 유형의 크기는 절대 변경되지 않습니다. 있다 new[]delete[]있지만를 사용하는 이유는 좀처럼있다.

무엇 reallocC에서하는 일은 단지가 될 가능성이 malloc, memcpy그리고 free사용할 수있는 충분한 연속 사용 가능한 메모리가있는 경우 메모리 관리자가 영리한 뭔가를 할 수 있지만, 어쨌든.


C ++에서 크기 조정은 생성자와 소멸자를 호출해야 할 가능성이 있기 때문에 어색합니다.

난 당신이 가질 수없는 이유를 C ++에서 근본적인 이유가 생각하지 않습니다 resize[]갈 운영자 new[]delete[]이 비슷한 일을했다 :

newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;

분명히 oldsize비밀 위치에서 검색 할 것 같은 그것에서이다 delete[], 및 Type피연산자의 유형에서 온 것입니다. resize[]유형이 복사 할 수없는 경우 실패합니다. 이는 해당 개체를 단순히 재배치 할 수 없기 때문에 정확합니다. 마지막으로, 위의 코드는 개체를 할당하기 전에 기본적으로 개체를 구성하므로 실제 동작으로는 원하지 않습니다.

newsize <= oldsize, 새로 축소 된 배열의 "끝을지나"객체에 대한 소멸자를 호출하고 다른 작업을 수행하지 않는 가능한 최적화가 있습니다. 표준은이 최적화가 필요한지 ( resize()벡터의 경우), 허용되지만 지정되지 않았 는지 , 허용되지만 구현에 따라 달라지는 지 또는 금지 되는지를 정의해야합니다 .

그런 다음 스스로에게 물어봐야 할 질문은 "이 기능을 제공하는 것이 실제로 유용 vector하며, 크기 조정이 가능한 컨테이너 (연속 메모리의 C ++ 98에서 생략 된 요구 사항)를 제공하도록 특별히 설계되었습니다. C ++ 03에서 수정 됨) C ++ 방식의 배열보다 더 적합합니까? "

대답은 "아니오"라고 널리 생각됩니다. 크기 조정이 가능한 버퍼를 C 방식으로 수행하려면 malloc / free / reallocC ++에서 사용할 수 있는를 사용하십시오 . 크기 조정이 가능한 버퍼를 C ++ 방식으로 수행하려면 벡터를 사용하십시오 (또는 deque실제로 연속 스토리지가 필요하지 않은 경우). new[]벡터와 같은 컨테이너를 구현하지 않는 한 원시 버퍼 를 사용하여 두 가지를 혼합하지 마십시오 .


다음과 같이 시도하십시오.

typedef struct Board
{
    string name;
    int size = 0;
};

typedef struct tagRDATA
{
    vector <Board> myBoards(255);

    // Board DataBoard[255];
    int SelectedBoard;

} RUNDATA;

벡터가 불평합니다. 이것이 어레이, malloc 및 new가 여전히 존재하는 이유입니다.

참고 URL : https://stackoverflow.com/questions/3482941/how-do-you-realloc-in-c

반응형