2017-11-09 5 views
0

Visual Studio 프로그램이 충돌합니다. 오류 디버그 어설 션이 실패했습니다. 내 코드에서 무엇이 잘못 되었습니까? 구문 오류가 없습니다. 오직 경고 : 배열 표현식의 삭제, 포인터로의 변환 cmd standart 컴파일러로 실행할 때 잘 동작합니다.Visual Studio 오류 디버그 어설 션이 실패했습니다

#include "stdafx.h" 
#include <stdio.h> 
#include <iostream> 
using namespace std; 

#define max_size 100 

class my_array{ 
    int* arr[max_size]; 
public: 
    my_array() {} 
    my_array(int size) { 
     if (size <= 0 || size > max_size) { 
      exit(1); 
     } 
     for (int i = 0; i < size; i++) { 
      arr[i] = new int; 
      cout << "Enter element [" << i + 1 << "] = "; 
      cin >> *arr[i]; 
     } 
    } 
    ~my_array() { 
     delete[] arr; 
    } 
    void operator[](int n) { 
     cout << endl; 
     for (int i = 0; i < n; i++) { 
      cout << "Enter element [" << i << "] = " << *arr[i] << endl; 
     } 
    } 
}; 

int main() { 
    my_array array(6); 
    array[5]; 

    return 0; 
} 
+3

'~ my_array()'에서'delete [] arr; '로 인해 정의되지 않은 동작입니다. 'arr'은'new'로 할당되지 않았기 때문에'delete'로 삭제해서는 안됩니다. –

+0

그리고 이것은 매우 물고기 같아요 :'arr [i] = new int;'. 무엇을 성취하려고합니까? 'int'에 대한 포인터의 배열을 가지고 있으며, 각각은 하나의'int'를 가리키고 있습니다. 속도, 메모리 사용 및 단순성과 관련해서도 효율적이지 않습니다. –

+0

그래서 생성자에서 배열을 할당하는 방법? –

답변

2

현재 arr을 삭제 :

delete[] arr; 

arr 동안은 new에 의해 할당 된 적이 없다. 원래 프로그램에서 arrint에 대한 포인터의 고정 된 크기 배열입니다.

당신은 아마이 원하는 :

class my_array { 
    int *arr; 
public: 
    my_array() {} 
    my_array(int size) { 
    if (size <= 0 || size > max_size) { // BTW this test isn't really necessary, as we 
             // can allocate as much memory as available 
             // anyway much more than just 100 
     exit(1); 
    } 

    arr = new int[size];   // allocate array of size size 
    for (int i = 0; i < size; i++) { 
     cout << "Enter element [" << i + 1 << "] = "; 
     cin >> arr[i]; 
    } 
    } 

    ~my_array() { 
    delete[] arr;    // delete array allocated previously 
    } 

    void operator[](int n) { 
    cout << endl; 
    for (int i = 0; i < n; i++) { 
     cout << "Enter element [" << i << "] = " << arr[i] << endl; 
    } 
    } 
}; 

대신 int로 포인터의 고정 된 크기의 배열을 가지고, 당신은 int s의 동적 배열을 가지고있다.

그래도 개선의 여지가 있습니다. 예를 들어 여기에 my_array() 생성자는 무의미합니다. 그리고 내용을 인쇄하는 데 [] 연산자를 사용하는 것이 이상하고 [] 연산자의 텍스트도 의심 스럽습니다.

+0

고마워요. 정확히 내가 원하는 것입니다. –

+0

왜 하향 형입니까? –

+0

나는 눌렀다는 생각이 전혀 없습니다^ –