객체 배열을 동적으로 할당
동적으로 할당된 배열이 포함된 객체로 작업할 때 이러한 객체의 전체 배열을 생성하는 것이 어려울 수 있습니다. . 다음과 같은 간단한 접근 방식을 사용하면
A* arrayOfAs = new A[5]; for (int i = 0; i < 5; ++i) { arrayOfAs[i] = A(3); }
루프 내에서 파괴된 A 객체가 내부 myArray 배열을 삭제하여 arrayOfAs의 배열 요소를 유효하지 않게 렌더링하므로 메모리 문제가 발생합니다.
이를 방지하려면 문제가 발생하면 "4의 규칙"(또는 C 11의 확장된 "5의 규칙")을 이해하는 것이 원시를 포함하는 클래스에 중요합니다. 포인터:
정의되지 않은 경우 컴파일러는 원시 포인터에 적합하지 않을 수 있는 이러한 메서드의 자체 버전을 생성합니다.
앞서 언급한 오류를 해결하려면 배열에 대한 포인터를 포함하는 클래스에는 다음이 포함됩니다.
class A { size_t mSize; int* mArray; public: A(size_t s = 0) {mSize=s;mArray = new int[mSize];} ~A() {delete [] mArray;} A(A const& copy) { mSize = copy.mSize; mArray = new int[copy.mSize]; // Handle copying of integers/other members } A& operator=(A other) { std::swap(mArray, other.mArray); std::swap(mSize, other.mSize); return *this; } };
또는 std::Vector와 같은 표준 컨테이너를 사용하면 프로세스를 단순화할 수 있습니다. 자동으로 메모리 관리 처리:
class A { std::vector<int> mArray; public: A(){} A(size_t s) :mArray(s) {} };
위 내용은 C에서 개체 배열을 동적으로 할당할 때 메모리 문제를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!