2014-11-19 3 views
0

동적으로 할당 된 메모리로 처리하는 동안 나타나는 문제가 있습니다. 비슷한 문제를 찾고 있었지만 안타깝게도 해결책이 없었습니다. 내 수업의디버그 어설 션이 실패했습니다! 잘못된 메모리 해제

선언 : 내 수업의

class StructuralElement 
{ 
    private: 
    short rows; 
    short columns; 
    short *se; 
    friend class Morph; 
public: 
    StructuralElement(char *path); 
    ~StructuralElement(); 
    short getAt(short row, short column); 
    int getSize(); 
}; 

정의 : 내 수업의 코드는 다음과 같습니다

StructuralElement::StructuralElement(char *path) 
{ 
std::string line; 
short rows=0, elements=0; 
short it = 0; 
std::string token; 
try 
{ 
    std::ifstream file(path);     //counting rows and columns in a file! 
    if (file.is_open() == NULL){ CannotOpenException ex; throw ex; } 
    if (file.fail()) { CannotOpenException ex; throw ex; } 
    while (getline(file,line)) 
    { 
     rows++; 
     std::stringstream ss(line); 
     while (getline(ss, token, ' ')) 
     { 
      elements++; 
     } 

    } 
    file.close(); 
    this->rows = rows; 
    if (rows!=0) 
    this->columns = (elements/rows); 
    se = new short[elements]; 

    std::ifstream file2(path); 
    if (!file2.is_open()) throw; 
    while (getline(file2, line)) 
    { 
     std::stringstream ss(line); 
     while (getline(ss, token, ' ')) 
     { 
      this->se[it++] = (static_cast<int>(token.at(0))-48);   
     } 
    } 
    file2.close(); 
} 
catch (CannotOpenException &ex) 
    { 
    std::cerr << "Error occured! Unable to load structural element!"; 
    } 
} 

StructuralElement::~StructuralElement() 
{ 
    if (se != NULL) delete[] se; 
} 

프로그램은 작업 완료 이미 텍스트가 나타납니다 때 " Cake any key .... "라고 표시되면 콘솔에 오류가 발생합니다.

디버그 어설 션 오류

.......

식 : _BLOCK_TYPR_IS_VALID (pHeap-> nBlockUse)

제가 = SE 라인을 변경할 때, 새로운 단락 [요소]; 님께 : se = new short [];
그런 다음 메시지가 표시됩니다. 프로그램이 중단 점에서 실행되었습니다.

내가 잘못 만들었습니까? 팁을 주셔서 미리 감사드립니다.

답변

3

두 번 삭제를 수행 할 가능성이 아주 높습니다.

클래스에 복사 생성자 또는 할당 연산자가 없지만 비 RAII 방식으로 리소스를 관리하고 있습니다. 그게 문제의 원인 일 가능성이 높습니다. 실제로 데이터 멤버를 전체 복사본으로 만드는 적절한 복사 생성자와 할당 연산자를 구현합니다.

0

티모 - 좋은 소식! 복사 생성자를 만드는 것은 내 문제를 해결했습니다. 내가 여기이 집에 붙어있어서 거대 고마워. 다시 한번 감사드립니다. 내가 복사 생성자를 사용하는 경우,

StructuralElement::StructuralElement(const StructuralElement &obj) 
    { 
     short *newse = new short[obj.columns*obj.rows]; 
     for (int i = 0; i < obj.columns*obj.rows; i++) 
      newse[i] = obj.se[i]; 
     this->rows = obj.rows; 
     this->columns = obj.columns; 
     this->se = newse; 
    } 

하지만 말해 : 여기 는 코드? 나는 기존 객체를 기반으로 새로운 객체를 생성하지 않는다고 생각합니까?

관련 문제