2013-05-05 3 views
0

에 실패했습니다. 헤더 파일에 배치 :디버그 주장은 내 업데이트 클래스의 소멸자를 사용하는 경우, 디버그 주장이 ... 메시지가 표시되지 <p></p> 여기 간결함을 위해 생략 일부 코드 내 업데이트 클래스, 어떤 이유로 메시지

using namespace std; 

class Update 
{ 
private: 
    int day, month, year; 
static const int FIELD_SIZE = 3, DEFAULT_DAY = 12, DEFAULT_MONTH = 12, 
    DEFAULT_YEAR = 1999, DAYS_IN_MONTH = 30, MONTHS_IN_YEAR = 12, DAYS_IN_YEAR = 365; 

int * date; 

public: 
static int dateUpdate; 

Update(int D, int M, int Y) 
{ 
    day = D; 
    if (day < 1 || day > DAYS_IN_MONTH) 
     day = DEFAULT_DAY; 
    month = M; 
    if (month < 1 || month > MONTHS_IN_YEAR) 
     month = DEFAULT_MONTH; 
    year = Y; 
    if (year < 1) 
     year = DEFAULT_YEAR; 

    date = new int [FIELD_SIZE]; 
    date[0] = day, date[1] = month, date[2] = year; 

    dateUpdate++; 
} 

~Update() 
{ 
    delete [] date; 

    dateUpdate--; 
} 

}};

여기에는 CPP 파일에 내 테스터 클래스 :

#include <iostream> 
#include "Update.h" 

int Update::dateUpdate = 0; 

int main() 
{ 
Update u1(29, 12, 2000); 
u1.Update::~Update(); 

return 0; 
} 

내가 디버그 어설 션 오류와 관련된 다른 질문을 읽어했지만 뭔가 나에게 말해 다양한 방법으로 발생할 수있는 디버그 어설 션 오류. 결과적으로 오류 메시지가 내 코드에 표시되는 이유에 대한 단서가 없습니다 ... 순간에 내 소멸자에 문제가 있습니까? 미리 도움을 주셔서 대단히 감사합니다!

+3

왜 소멸자를 명시 적으로 호출합니까? – olevegard

+0

무거운 짐을지는 용기 대신에'new []'와'delete []'를 사용하는 이유는 무엇입니까? – chris

+0

그게 끝나지 않았나요? 나는 당시 msdn.microsoft.com/en-us/library/35xa3368%28v=vs.80%29.aspx를보고있었습니다 ... – user1800967

답변

1

다음 행을 변경해야합니다.
날짜 [0] = 날짜, 날짜 [1] = 월, 날짜 [2] = 연도;

사람 :

date[0] = day; 
date[1] = month; 
date[2] = year; 

당신은 마지막 식의 결과를 반환하는 쉼표 연산자을 사용하고 있습니다. 이것은 초기화에서 쉼표가 작동하는 방식과 동일하지 않습니다.

또한 main 함수에서 명시 적으로 소멸자를 호출 할 필요가 없습니다.

귀하의 최신 방법 당신은 함수의 매개 변수에 액세스하는 대신 직접의 기능에 복사를 할 수 1월 31일도 12 월 31 일

을 처리 할 수 ​​없습니다. 예 : day = D;은 필요하지 않습니다. 매개 변수에 직접 액세스하십시오 : if ((D < 1) ....

부호없는 정수를 사용하면 음수를 확인할 필요가 없습니다. 나는 내 인생에서 부정적인 날, 한 달 또는 한 해를 경험하지 못했습니다.

이 코드는 C++이고 Java 또는 C#이 아니기 때문에 변수를 동적으로 할당 할 필요가 없습니다. 따라서 int * date을 사용하는 대신 int date[3]을 사용할 수 있습니다.

u1.Update::~Update(); 

이 정의되지 않은 동작을 일으키는 두 번 호출되는이 방법으로, 나는 [] 날짜를 삭제 가정; 명시 적으로 소멸자를 호출하기 때문에

+0

쉼표 사용 (그것은 각 변수에 각 값을 할당 할 것입니다.)하지만 여전히 좋은 습관은 아닙니다. – chris

+0

내가 작업하고있는 특정 할당에 대해서는 음수가 좋습니다. 그래서 멋지다. 감사. – user1800967

2

문제는 두 번 호출, alreade에 두 번째 시간은 메모리를 해제.

int * date; 

이 실제로 C의 매우 낮은 수준의 프로그래밍 스타일 ++와 많은 문제가 발생할 수 있습니다

코드의 또 다른 문제는 당신이 배열 베어 포인터를 사용하고 있다는 점이다. Update 클래스가 복사 될 때 새 날짜 배열을 할당 할 클래스 복사 생성자 및 대입 연산자 (*)를 구현해야합니다. 그렇지 않으면 다시 여러 날짜 포인터 삭제 문제가 발생합니다.

가장 좋은 방법은 내가 좋은 링크를 생각

std::vector<int> date; 

(*)와 같은 벡터를 사용하는 경우의 규칙 세 (5의 C++ 11 규칙부터) 설명 여기에 적용 Rule-of-Three becomes Rule-of-Five with C++11?

+0

그리고 이것이 수동 메모리 관리가 그렇게 나쁜 이유입니다. 당신은 대입 연산자에 대한 필요성을 언급하지 않았고, C++ 11에서 이들의 버전을 옮길 수 있습니다. 또한 객체에서 소멸자를 두 번 호출하는 것은 비어있는 경우에도 정의되지 않은 동작입니다. – chris