2014-12-12 16 views
0

포인터 메모리를 삭제하려고 할 때 _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse) 오류가 발생합니다. 나는 두 번 삭제 해요처럼 보인다._BLOCK_TYPE_IS_VALID (pHead-> nBlockUse 오류) Visual Studio 2012

사람이 안내 주실 래요 ..

enum SHAPE_TYPES {RECTANGLE, TRIANGLE, CIRCLE}; 
map<SHAPE_TYPES,vector<Shape *>> shapeMap; 

vector<Shape *>rectVector; 
shapeMap.insert(pair<SHAPE_TYPES, vector<Shape*>>(RECTANGLE,rectVector)); 


map<SHAPE_TYPES,vector<Shape *>>::iterator mapIter; 
mapIter = shapeMap.find(RECTANGLE); 
     if (mapIter != shapeMap.end()) 
     { 
      // create the shape 
      RandomAttributes(R[shapes]); 
      // the key was found, so add data 
      shapePtr = R; 
      mapIter->second.push_back(shapePtr); 
     } 

나중에

map<SHAPE_TYPES,vector<Shape *>>::iterator mapIter; 
mapIter = shapeMap.find(RECTANGLE); 
     if (mapIter != shapeMap.end()) 
     { 
      if (!mapIter->second.empty()) 
       { 
        mapIter->second.back()->Draw(); 

        delete mapIter->second.back(); // -- error causing line 
        mapIter->second.pop_back(); 
       } 
      } 
+0

'R'이란 무엇입니까? '모양 '이란 무엇입니까? 'RandomAttributes'는 무엇을합니까? [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)를 만들어 보여 주시겠습니까? –

+0

R는 Rectangle 클래스의 객체입니다. 셰이프는 for 루프의 카운터 일뿐입니다. 그것은 기본적으로지도 내부의 벡터에 삽입 한 요소의 수와 동일하게 반복됩니다. RandomAttributes는 다른 클래스의 다른 객체에 일부 기능을 할당합니다. 그 중 아무 것도 실제로 포인터를 삭제하는 것과 아무 관계가 없다고 생각합니다. 나는 데이터를 삭제하는 데 소멸자가 없다는 것을 확인했다. – rSU

+0

우리가 정말로 알아야 할 것은 * 선언하고 *'R'을 초기화하는 방법입니다. 배열입니까? 동적으로 할당합니까? –

답변

0

에 코드 어쩌면 두 개 (또는 그 이상)의 문제가 적어도 하나 있습니다 .

첫 번째 문제점은 R어레이이고 컴파일 할 때 컴파일러가 정적으로 배열을 할당한다는 것입니다. delete하지 않아야합니다. delete 당신은 new이고, delete[] 당신은 new[]입니다. std::array 또는 std::vector을 사용하고 간단한 할당을 사용할 수 있고 배열 (또는 벡터)이 복사되는 경우 왜 오래된 C 스타일 배열을 사용해야할까요?

배열이 함수에서 로컬로 정의 된 경우 다른 함수에서 포인터를 사용하면 또 다른 문제가 발생할 수 있습니다. 이것은 로컬 변수가 정의 된 함수 (또는 함수 내부의 블록)에 로컬 변수가 이기 때문입니다. 코드가 블록을 벗어나면 로컬 변수가 정의되고 블록이 소멸됩니다. 포인터가 있으면 포인터 더 이상 존재하지 않는 데이터를 가리키며 undefined behavior으로 연결됩니다.

+0

둘 다 주에 있기 때문에 기능 범위가 문제가되지 않습니다. 내가 삭제하는 방식과 관련이있을 수 있습니다. 삭제에 관해서 ... 만약 우리가 단지 arr을 삭제하면, 그것은 특정 요소를 삭제하지만, 삭제하면 [] 전체가 삭제됩니다. 따라서 올바른 삭제 만 사용하지 않습니까? 나는 이것을 시도했다 delete [] mapIter-> second.back(); – rSU

+0

@rSU 내 대답의 두 번째 단락, 특히 그 단락의 처음 두 문장을 다시 읽으십시오. –

+0

오, 이런. 하지만 난 여전히 다른 함수에서 포인터를 사용하지 마십시오. 모든 것이 본부에서 이루어지고 있습니다. – rSU