동적 메모리 배열을 확장하는 방법이 있습니까? 다음과 같이하십시오 :C++에서 동적 메모리 배열을 확장하는 방법이 있습니까?
int *a = new int[5];
*a = new int[2];
이것은 합법적입니까?
동적 메모리 배열을 확장하는 방법이 있습니까? 다음과 같이하십시오 :C++에서 동적 메모리 배열을 확장하는 방법이 있습니까?
int *a = new int[5];
*a = new int[2];
이것은 합법적입니까?
이 유형의 동적 메모리 배열은 확장 할 수 없습니다. malloc
과 realloc
을 사용할 수 있지만이 기능이 필요하다면 그 대신에 조언을하고 <vector>
을 포함하고 std::vector
을 사용하는 것이 좋습니다. 그것에는 resize
방법이 있습니다.
또한 설명 된 내용은 컴파일되지 않습니다. 다음은 수행 할 것입니다 :
1: int *a = new int[5];
2: a = new int[2];
위의 두 메모리 블록은 모두 소멸되지 않습니다. 두 번째 줄은 새로운 배열을 동일한 int *a
포인터에 할당합니다. 할당 된 메모리가 포인터에 의해 참조되는 것을 멈 추면 이것을 메모리 누수라고합니다. 위의 코드는 new int[5]
에 대한 참조를 잃었으므로이 메모리를 운영 체제에서 비울 방법이 없습니다.
매우 실용적인 예는 아니지만 배열/벡터의 크기를 조정하는 방법은 여러 가지가 있습니다. 이 배열의 크기를 증가하는 것이 실용적으로 , 난 그냥이 작업을 수행합니다 : realloc
스마트 아무것도하지 않습니다 가치가
{ // C++ vector on the stack (although internally vector uses memory from the heap)
std::vector<int> a(1024);
// do smth
a.resize(4096); // note: this does not always reallocate
// do smth else
}
{ // C++ everything on the heap
std::vector<int> *a = new std::vector<int>(1024);
// do smth
a->resize(4096); // note: this does not always reallocate
// do smth else
delete a;
}
{ // C style
int *a = (int*)malloc(1024*sizeof(int));
// do smth
a = realloc(a, 4096*sizeof(int));
// do smth else
free(a);
}
. 그것은이하는 모든입니다
malloc
memcpy
free
너 수 있습니다 확실하게 배열을 확장하지만, 내용을 복사하고 무료로 처리해야합니다 이전 배열 (잘못된 구문이 아 니라 코드에서 btw 배열을 줄입니다.).
정확히 std::vector
의 작동 방식은 이므로 걱정할 필요가 없습니다..
{
std::unique_ptr<int[]> d(a);
a = new int[desired_new_size];
for(unsigned int i = 0; i < min_old_size_and_new_size; ++i)
a[i] = d[i];
}
주 엄격 결코 정말 배열을 확장하지 "확장"말하기,하지만 (서로 더 큰으로 대체 : int *a
가 이미 할당 가진 그러니까 기본적으로
는 어떤 일이 필요로하는 것은 같은 것이있다 동일한 기능을 제공하는 컨테이너의 경우에도 마찬가지입니다). 그러나 이것은 포인터를 나중에 사용하는 코드에 투명합니다. 아무도 알 수 없습니다.
당신이해야 결코 사용 realloc
(또는 다른 C 메모리 할당 기능) 위의 지적 메모리 할당 또는 operator new
및 delete
(또는 new[]
및 delete[]
)에 의해 해제와 함께한다.
이 은 (보통 가능)으로 작동하지만 개념적으로 잘못되어 충돌이 발생하지 않는 경우 순수한 운 (알 수없는 구현 세부 사항)입니다.
이 코드에서 기대할 수있는 점이 무엇입니까? – sth
확실하다. 그 코드는 합법적이다. 아마 당신이 생각하는 것을하지 않을 것이다. – Bwmat
'std :: vector'을 사용하십시오. –
GManNickG