공공 운영자 신규, 개인 운영자 삭제 : C2248 GETCTIC를 사용하는 경우“개인 회원에 액세스 할 수 없습니다”

StackOverflow https://stackoverflow.com/questions/1820069

문제

클래스에 연산자가 과부하되었습니다 new 그리고 delete. new 공개되어 있습니다. delete 비공개입니다.

이 클래스의 인스턴스를 구성 할 때 다음과 같은 오류가 발생합니다.

pFoo = new Foo(bar)

예제.

그러나 전화는 없습니다 delete 여기, 컴파일러의 뒤틀린 마음에서 무슨 일이 일어나고 있습니까? :)

  1. 오류의 이유는 무엇입니까?
  2. 회원에게 의지하지 않고 문제를 해결할 수 있습니까? CreateInstance 기능?
도움이 되었습니까?

해결책

당신이 할 때 new Foo() 그런 다음 두 가지 일이 발생합니다. 첫째 operator new 메모리를 할당하기 위해 호출 된 다음 생성자가 Foo 호출됩니다. 해당 생성자가 던져진 경우 이미 할당 된 메모리에 액세스 할 수 없으므로 C ++ 런타임은 적절한 사람에게 전달하여이를 처리합니다. operator delete. 그렇기 때문에 항상 매칭을 구현해야합니다 operator delete 마다 operator new 당신은 글을 쓰고 그것이 접근 할 수 있어야하는 이유입니다.

외출 방법으로 둘 다 개인을 비공개로 만들고 호출 할 수 있습니다. operator new 공개 회원 기능 (좋아요 create()).

다른 팁

확인하다 이것. 더 낮은 단락 중 하나에서는 새로운 삭제에 액세스 할 수 있어야한다고 말합니다. 기본적으로, 다시 삭제할 수있는 경우 힙에 객체 만 만들 수 있다고 말합니다.

C ++ 표준에 따라 동적 메모리 할당이있는 클래스가 있고 생성자 내부에서 예외가 제기되면 메모리 누출을 피하기 위해 메모리가 해제되어야합니다.

여기에서는 새로운 운영자를 공개적으로 정의했지만 Delete는 비공개입니다.

따라서 컴파일러는 생성자에서 예외가 발생하면 메모리 누출을 방지 할 수 있도록 삭제 연산자에 액세스 할 수 있다고 알려줍니다.

삭제 연산자를 정의하지 않으면 컴파일러가 오류를 제공하고 강제로 정의하도록합니다.

  • "1. 오류의 이유는 무엇입니까?"

    SBI의 대답은 좋습니다.

  • "2. 멤버 CreateInstance 기능에 의지하지 않고 문제를 해결할 수 있습니까?"

    예. 개인 소멸자를 만듭니다.

클래스 생성자가 예외를 던지는 경우 클래스에서 Operator New를 호출하는 클래스도 삭제됩니다.

라이브러리에서 예외를 사용하지 않으면 컴파일러 "-fno-exceptions"에서 예외를 비활성화 할 수 있다면 더 이상 오류가 나타나지 않습니다. (Visual Studio에서 "C/C ++", "Code Generation", "C ++ 예외 활성화"> "no (-fno-exceptions)").

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top