2016-10-05 2 views
0

헤더 파일의 코드를 테스트 할 때 모든 종류의 메모리 오류가 발생합니다. 같은 점이 나에게 무엇이 잘못되었는지 알려주도록 도와주세요. 고맙습니다!C++ 코드의 메모리 할당 오류

해당 코드는 아래의 코드 블록에있는 코드입니다. 그것은 그 자체로 꽤 설명하는 주석을 가지고 있습니다.

도움 주셔서 감사합니다.

#include <algorithm> 

class sorted_sc_array { 
public: 
    sorted_sc_array() : size_(0), ptr_(nullptr), arr_len(1000) { 
     ptr_ = new signed char[arr_len]; 
    } 

    ~sorted_sc_array() { delete[] ptr_; } 

    // IMPLEMENT ME (DONE!!!! SOME EDITS REQD) 
    sorted_sc_array(const sorted_sc_array& A) {this->size_ = A.size_; this->ptr_ = A.ptr_; /* change this to match the definition of operator=() function */} 

    // IMPLEMENT ME (DONE!!!!) 
    sorted_sc_array& operator=(const sorted_sc_array& A) { 
     if (this == &A) return *this; 
     delete[] ptr_; 
     size_ = A.size_; 
     if (size_ == 0) ptr_ = nullptr; 
     else { 
      ptr_ = new signed char[size_]; 
      std::copy(A.ptr_, A.ptr_ + size_, ptr_); 
     } 
     return *this; 
    } 

    // RETURNS SIZE OF THE ARRAY (i.e. HOW MANY ELEMENTS IT STORES) 
    int size() const { return size_; } 

    // RETURNS RAW POINTER TO THE ACTUAL DATA, CAN BE INVOKED AT ANY TIME 
    const signed char* data() const { return ptr_; } 

    // IMPLEMENT ME: AFTER INSERT COMPLETES THE ARRAY MUST BE IN ASCENDING ORDER (TBD!!!) 
    void insert(signed char c) { 
     if (size_ < arr_len) { 
      ptr_[size_++] = c; 
      std::sort(ptr_, ptr_ + size_); 
     } 

     else { 
      int arr_len_new = arr_len*2; 
      ptr_ = new signed char[arr_len_new]; 
      std::copy(ptr_, ptr_ + size_, ptr_); 

      ptr_[size_++] = c; 
      std::sort(ptr_, ptr_ + size_); 
     } 

     // maybe use std::sort (myvector.begin(), myvector.end()); 
     // if inefficient, use binary insertion 
    } 

private: 
    int size_;   // size of the array 
    signed char* ptr_; // pointer to the array 
    unsigned int arr_len; // dynamic mem alloc for array  
}; // class sorted_sc_array 
+0

? 디버거에서 코드를 실행하여 무엇을 배웠습니까? – Barmar

+0

"모든 종류의 메모리 오류"가 너무 일반적입니다. 더 잘 지정하십시오. – Amadeus

+0

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

답변

0

insert() 함수에는 배열을 확장 할 때 많은 오류가 있습니다.

  1. 새 길이로 arr_len을 업데이트하지 않습니다.
  2. 이전 배열의 값을 복사하기 전에 새 배열로 ptr_을 다시 할당 한 다음 배열을 복사합니다. 이를 위해 임시 변수를 사용해야합니다.
  3. 이전 배열을 해제하지 않습니다.

이는 이러한 문제를 해결

당신이지고 어떤 오류
void insert(signed char c) { 
    if (size_ < arr_len) { 
     ptr_[size_++] = c; 
     std::sort(ptr_, ptr_ + size_); 
    } 

    else { 
     arr_len = arr_len*2; 
     signed char *ptr_new = new signed char[arr_len]; 
     std::copy(ptr_, ptr_ + size_, ptr_new); 
     delete[] ptr_; 
     ptr_ = ptr_new; 
     ptr_[size_++] = c; 
     std::sort(ptr_, ptr_ + size_); 
    } 
+0

고맙습니다. 고칠 것입니다. 그러나 특정 오류가 무엇을 의미하는지 말해 줄 수 있습니까? 내 컴파일러는 다음과 같이 말합니다 : "손상된 이중 연결 목록 : 0x0000 .... aba110" –

+0

프로그램의 일부가 정의되지 않은 동작을 일으켜 힙 메모리가 손상되었습니다. 아마 OlafDietsche가 그의 대답에서 언급 한 문제. – Barmar

+0

도움을 많이 주셔서 감사합니다. 마지막 질문 하나만해도 될까요? 내 프로그램에서 삽입 메소드를 구현하는 가장 효율적인 방법은 무엇입니까? 귀하의 제안으로 인해 프로그램이 성공적으로 실행될 수 있었지만 효율성을 향상시켜야합니다. 도와 주셔서 다시 한번 감사드립니다! –

0

구체적인 오류는 사용자가 지정하지 않습니다. 하지만 대부분의 경우 문제는 arr_len 회원을 무시한 것입니다. size_을 복사하고 메모리를 올바르게 할당하지만 초기화 또는 복사 할 때는 arr_len을 무시합니다. 이렇게하면 나중에 초기화되지 않은 arr_len에 액세스하여 비교할 때 문제가 발생합니다.

+0

생성자는'arr_len'을 1000으로 초기화합니다. – Barmar

+0

예, * 생성자 *에는 있지만 생성자에는 없습니다. 그리고 그것은'operator ='에서 무시됩니다. –