C ++에서 어떻게 'realloc'을 사용합니까?
realloc
C ++에서 어떻게 할 수 있습니까? 그것은 언어에서 누락 된 것 같다 -이 new
와 delete
있지만 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[]
있지만를 사용하는 이유는 좀처럼있다.
무엇 realloc
C에서하는 일은 단지가 될 가능성이 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 / realloc
C ++에서 사용할 수 있는를 사용하십시오 . 크기 조정이 가능한 버퍼를 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
'Program Tip' 카테고리의 다른 글
PHP의 클로저… 정확히 무엇이며 언제 사용해야합니까? (0) | 2020.10.12 |
---|---|
log4j : WARN web.xml에서 로거에 대한 추가자를 찾을 수 없습니다. (0) | 2020.10.12 |
SLF4J를 사용하여 자리 표시자를 사용하여 예외 및 메시지를 기록하는 방법 (0) | 2020.10.12 |
Android의 오프라인 음성 인식 (JellyBean) (0) | 2020.10.12 |
반환이있는 Switch 문 — 코드 정확성 (0) | 2020.10.11 |