2010-12-29 2 views
1

기본 소멸자 제공시 실행 오류가 발생합니다. 그러나 기본 소멸자를 제공하기 위해 컴파일러에 맡기면 안전하게 실행됩니다.MS Visual C++ 2010 오류 : 기본 소멸자 제공시

class foo 
{ 
    private: 
    int m_size; 
    int* m_array; 

    public: 
    foo(int a_size):m_size(a_size), m_array(new int(a_size)){} 

    ~foo() { 
     delete [] m_array; 
    } 
    void setArray(); 
}; 

void foo::setArray() 
{ 
    for(int i=0; i<m_size; ++i) 
     m_array[i] = 10*i; 
} 

int main(int argc, const char* argv[]) 
{ 
    class foo obj(6); 
    obj.setArray(); 
    system("pause"); 
    return 0; 
} 

런타임 오류 :

이 Destructors.exe하거나로드 된 DLL이 어떤 버그를 나타내는 힙의 손상이 원인 일 수 있습니다.

또한 Templates.exe에 포커스가있는 동안 사용자가 F12 키를 누르기 때문일 수 있습니다.

출력 창이 더 많은 진단 정보를 가지고있을 수 있습니다.

감사합니다.

+0

난 당신 같은이 모습을 만들려고 노력하고 어떤 언어 모르겠지만, 당신의 형식이 나에게 견과류를 구동한다. –

+0

@Ben Voigt 죄송합니다! 나는 SO에서 포맷하는 것을 처음이다. 뭐가 잘못됐다고 생각하니? – Mahesh

+0

세미콜론을 사용하기 전에 공백이 생기고 범위 연산자'::'주위에 공백이 생깁니다. 실제로 불법은 아니지만 모든 다른 C++ 프로그래머가 작성한 코드와 일치하지 않습니다. 'for' 루프는 꼭 들어가야합니다. 왜냐하면 지금은 닫힌 중괄호가 함수 대신 for 루프에 속해있는 것처럼 보입니다. 그리고 개인적으로 타입과 함수의 여는 중괄호를 새 행에 삽입합니다 (단, 같은 줄에'if','for','do' 및'while' 다음에 중괄호를 씁니다). –

답변

4

new int(a_size)a_size 인 하나의 int을 동적으로 할당합니다.

new int[a_size]은 동적으로 a_sizeint의 배열을 할당한다고 생각합니다.

(당신은 또한 복사 생성자를 제공하고 올바른 일을하지 않습니다 기본 것과 같은 당신의 foo 클래스의 대입 연산자를 복사해야합니다. 더 나은 자동으로 동적으로 할당 된 메모리를 관리 할 std::vector<int>로 포인터 멤버 m_array을 대체하는 것 사용자 정의 소멸자, 복사 생성자 및 복사 할당 연산자에 대해 걱정할 필요가 없습니다.

+0

감사. 어리석은 실수! – Mahesh

2

int 하나를 할당 한 다음 배열 삭제를 시도했습니다.

int의 배열을 할당하는 적절한 방법은 다음

new int[a_size] 

주 사각 (배열) 브래킷하지 괄호.

항상 그렇듯이 rule of three을 따라 복사 생성자를 정의해야합니다.

편집 : 내 선호하는 스타일을 보여주는 :

class Foo 
{ 
    int m_size; 
    int* m_array; 

public: 
    Foo(int const a_size) 
     : m_size(a_size) 
     , m_array(new int[a_size]) 
    {} 

    ~Foo(void) 
    { 
     delete [] m_array; 
    } 

    void setArray(void); 
}; 

void Foo::setArray(void) 
{ 
    for(int i = 0; i < m_size; ++i) 
     m_array[i] = 10*i; 
} 

int main(void) 
{ 
    Foo obj(6); 
    obj.setArray(); 
    system("pause"); 
    return 0; 
} 
+0

"rule of three"정보를 제공해 주셔서 감사합니다. – Mahesh

+0

@Mahesh : 사실 FredOverflow에 감사해야합니다. 그 시간은 모든 시간을 포괄적 인 설명으로 작성하는 것입니다. 내가 한 모든 것은 그것에 대한 링크였습니다. –

+0

동시에 내 게시물을 수정하고있었습니다. 모든 방법, 감사 및 코드가 멋지게 보입니다. – Mahesh