문제

그래서 나는 포인터 배열의 포인터입니다.를 삭제하면 이를 다음과 같이 설명합니다:

delete [] PointerToPointers;

그 삭제 모든 지적인 포인터가?하지 않을 경우,마가 루프의 포인터 및 삭제 뿐만 아니라,거기 쉬운 방법으로 할 수 있나요?Google 푸 보이지 않게 좋은 이 질문에 답하게 한다.

(그래,내가 알고 있을 사용할 필요가 벡터입니다.이것은 하나의 사람들을 잡아"에서는 C++"유형을 지정합니다.)

도움이 되었습니까?

해결책

예를 반복하여를 통해 포인터,삭제됩니다.

이유:어떤 경우는 다른 코드가 포인터를 객체에 배열?C++컴파일러 알 수 없는 경우에는 진실하다,그래서 당신은 분명하게 명시되어 있습니다.

에 대한"쉽 방법,"두 개의 제안:(1)서브루틴을 이 목적을 위해서 적어도 당신은 필요가 없 코드를 작성합니다.(2)사용"스마트 포인"디자인 패러다임을 보유한 객체 배열을 참조-카운터,다음 객체를 삭제할 때는 객체는 더 이상에서 참조 코드.

다른 팁

동의함으로는 제이슨 코헨 하지만 우리는 조금 더 명확한 이유에 대한 필요를 삭제하려면 포인터로 반복입니다.에 대한 모든"새로운"또는 동적 메모리 할당될 수 있"삭제"메모리 할당.일부 시간이"삭제"숨길 수 있습으로 smartpointers 하지만 그것은 아직도있다.

int main()
{
  int *pI = new int;
  int *pArr = new int[10];

지금까지 코드에서는 우리는 할당 두 개의 덩어리의 동적 메모리입니다.첫 번째는 그냥 일반 int 두 번째는 배열의 수.

  delete pI;
  delete [] pArr;

이러한 삭제 문을 명확한 메모리를 할당한"새로운"s

  int ppArr = new int *[10];

  for( int indx = 0; indx < 10; ++indx )
  {
    ppArr[indx] = new int;
  }

이 코드는 모두 이전의 할당입니다.먼저 우리는 우리 공간을 만들기 위한 우리의 int 에서 동적 배열입니다.우리는 그런 다음 필요가 루프를 통해 할당 int 에 대한 각 지점에서 배열입니다.

  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

순서를 참고하는 내가 할당되는 메모리고 그는 나는 할당 그것에 반대의 순서입니다.이 때문에 우리가 할 수 있는 삭제[]ppArr;먼저 우리를 잃을 것을 배열을 알리는 우리가 무엇을 우리의 다른 포인터이다.는 덩어리 또는 메모리 주시고 그래서 할 수 없이 안정적으로 읽습니다.

  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

  ppArr[0] = &a;
  ppArr[1] = &b;
  ppArr[2] = &c;

이는 내 생각이 언급되어야뿐만 아니라.다만으로 작업하기 때문에 포인터는 것을 의미하지 않는 이 메모리는 그 포인터를 동적으로 할당됩니다.는 말을 그냥 당신이 가지고 있기 때문에 포인터를 의미하지 않는 반드시 필요합니다.배열 내가 만들어진 여기가 동적으로 할당되지만 점점 지역의 인스턴스의 수을 때 우리는 삭제이 우리를 삭제할 필요는 배열입니다.

  delete [] ppArr;

  return 0;

}

끝에서 동적으로 할당되는 메모리 까다로운 일이 될 수 있습과 어쨌든할 수 있습 감싸 안전하게 처럼에서 스마트 또는 포인터를 사용하여 stl 컨테이너 오히려 그런 다음 자신의 인생을 만들 수 있습이 훨씬 더 많은 쾌적하다.

부스트 포인터 컨테이너 컨테이너가 자동으로 삭제된 포인터 위해 당신을 유지하면서,구문에 매우 근접하는 일반 STL 컨테이너입니다.

포인터가 꽤 많은 단지 메모리 참조지 않는 깔끔한 작은 셀프-클리닝.net 개체입니다.을 만드는 적절한 소멸자를 위한 각 클래스를 만들 것입 삭제 조금보다 더 깨끗하고 거대한 루프를 통해 코드입니다.

자(pseudocoded)실제 예제입니다.당신이 상상했다 클래스는 다음과 같다:

class Street
{
    public:
        Street();
        ~Street();
    private:
        int HouseNumbers_[];
}

typedef *Street StreetSign;

배열이 있는 경우의 거리 표지판과를 삭제하는 배열의 streetsigns,는 것을 의미하지 않는 자동으로 삭제 sreets.그들은 여전히,벽돌 및 박격포,그들은 단지 없는 그 흔적이 그들을 가리키는 더 이상.당신이 가지고를 제거 그 특정 인스턴스 포인터의 거리를 달리고 있기 때문이다.

포인터 배열은(을 개념적으로)비트와 같은 정수 배열을,그것은 배열의 숫자를 나타내는 메모리 위치의 다양한 객체입니다.지 않는 객체다.

삭제할 경우[]을 포인터 배열,모든 당신이 삭제는 배열의 정수입니다.

나는 당신을 생각해야 할 것을 반복해 난 두려워합니다.

내가 왜 이는 응답되었고 그래서 혼동을 일으킬 정도다.

을 삭제하시는 경우 포인터 배열,당신이 무료 메모리 사용되는 배열의 일반적으로 수.
개체에 대한 포인터가 포함된 정수 번지.

당신이 삭제의 무리는 한줄지만,없다.

삭제에 대해 걱정하지 않는 콘텐츠의 메모리 공간, 그것은 소멸자(들)과 마크 mem 으로 무료입니다.

그것은 걱정하지 않는 그냥 삭제의 무리는 한줄 의 개체,단지 그것을 보고 수.

그 이유는 당신 사이클을 배열을 통해 처음!고 부르 삭제 에서 모든 요소를 삭제할 수 있습니다의 저장을 배 자체입니다.

만,지금 응답 가지고 다소니다.....이상한...;)

편집:제이슨의 대답은 잘못이 없습니다,그것은 단지 실패들을 발견했다.도 컴파일러나 다른 아무것도 c(++)에 대한 관심은 당신을 삭제하는 재료는 다른 곳에서 지적했습니다.을 수행할 수 있습니다.다른 프로그램의 부품을 사용하려는 삭제된 개체 니다 세그멘테이션에서 당신입니다.그러나 아무도 당신을 방해하는 것입니다.어느 쪽도 아니다 그것이 문제가 될을 파괴하는 포인터 배열체를 때는 객체 참조습니다.

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