> 백엔드 개발 > C++ > C에서 개체 배열을 동적으로 할당할 때 메모리 문제를 방지하는 방법은 무엇입니까?

C에서 개체 배열을 동적으로 할당할 때 메모리 문제를 방지하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-18 06:52:17
원래의
675명이 탐색했습니다.

How to Avoid Memory Issues When Dynamically Allocating an Array of Objects in C  ?

객체 배열을 동적으로 할당

동적으로 할당된 배열이 포함된 객체로 작업할 때 이러한 객체의 전체 배열을 생성하는 것이 어려울 수 있습니다. . 다음과 같은 간단한 접근 방식을 사용하면

A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i) {
    arrayOfAs[i] = A(3);
}
로그인 후 복사

루프 내에서 파괴된 A 객체가 내부 myArray 배열을 삭제하여 arrayOfAs의 배열 요소를 유효하지 않게 렌더링하므로 메모리 문제가 발생합니다.

이를 방지하려면 문제가 발생하면 "4의 규칙"(또는 C 11의 확장된 "5의 규칙")을 이해하는 것이 원시를 포함하는 클래스에 중요합니다. 포인터:

  1. 생성자
  2. 소멸자
  3. 복사 생성자
  4. 할당 연산자
  5. 이동 생성자(C 11)
  6. 과제 이동(C 11)

정의되지 않은 경우 컴파일러는 원시 포인터에 적합하지 않을 수 있는 이러한 메서드의 자체 버전을 생성합니다.

앞서 언급한 오류를 해결하려면 배열에 대한 포인터를 포함하는 클래스에는 다음이 포함됩니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿