2016-10-05 34 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_與新數組,然後它複製舊數組中的值,然後它將數組複製到它自己。你需要爲此使用一個臨時變量。它不會釋放舊數組。

這解決這些問題:

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

是的,在* default *構造函數中,但不在複製構造函數中。它在'operator ='中被忽略。 –