2014-01-17 23 views
1

我正在使用另一個C++編碼器爲我提供給我的示例代碼。我是C++語言的新學生,我想知道是否有可能存在內存泄漏/中(PlacementHead.cpp)給我這個類文件中的錯誤:我的C++文件中是否有可能的內存泄漏?

#include "PlacementHead.h" 
#include <string> 
#include <iostream> 
#include <string.h> 

PlacementHead::PlacementHead(int width, int height, int gap, char* s) { 
    width_ = width; 
    height_ = height; 
    gap_ = gap; 
    size_ = (width*height)+1; 
    set_ = new char[size_ + 1]; 
    from_ = new int[size_ + 1]; 
    original_ = new char[size_ + 1]; 
    strcpy(set_,s); 
    strcpy(original_,s); 
} 

PlacementHead::~PlacementHead() { 

} 

int PlacementHead::getSize() { return size_; } 
int PlacementHead::getHeight() { return height_; } 
int PlacementHead::getWidth() { return width_; } 
int PlacementHead::getGap() { return gap_; } 

// Palauttaa indeksissä i olevan suuttimen 
char PlacementHead::getNozzle(int i) { 
    return set_[i-1]; 
} 

// Asettaa indeksissä i olevan suuttimen 
void PlacementHead::setNozzle(int i, char c) { 
    set_[i-1] = c; 
} 

// Merkitsee suuttimen poimituksi poistamalla sen listasta 
void PlacementHead::markNozzle(int i, int bankPos) { 
    set_[i-1] = ' '; 
    from_[i-1] = bankPos; 
} 

// Palauttaa seuraavan poimimattoman suuttimen indeksin 
int PlacementHead::getNextUnmarkedPos() { 
    for (int i=0; i<size_; i++) { 
     if (set_[i]!=' ') { 
      return i+1; 
     } 
    } 
    return 0; 
} 

// Palauttaa suuttimen alkuperäisen sijainnin pankissa 
int PlacementHead::getBankPos(int i) { 
    return from_[i-1]; 
} 

// Plauttaa alkuperäisen ladontapaan suutinjärjestyksen 
void PlacementHead::reset() { 
    //for (int i=0; i<size_; i++) { 
    // set_[i] = original_[i]; 
    //} 
    strcpy(set_,original_); 
} 

// Tulostusmetodi 
void PlacementHead::print() { 
    std::cout << "ladontapaa:\n"; 
    for (int h=height_; h>0; h--) { 
     for (int w=width_; w>0; w--) { 
      int i = ((h-1)*width_)+w; 
      std::cout << getNozzle(i); 
     } 
     std::cout << "\n"; 
    } 
} 

PlacementHead.h:

#ifndef PLACEMENTHEAD_H 
#define PLACEMENTHEAD_H 

class PlacementHead { 
    public: 
     PlacementHead(int size, int rows, int gap, char* s); 
     ~PlacementHead(); 
     int getSize(); 
     int getHeight(); 
     int getWidth(); 
     int getGap(); 
     char getNozzle(int i); 
     void setNozzle(int i, char c); 
     void markNozzle(int i, int bankPos); 
     int getNextUnmarkedPos(); 
     int getBankPos(int i); 
     void reset(); 
     void print(); 
    private: 
     char* set_; 
     int* from_; 
     char* original_; 
     int size_; 
     int width_; 
     int height_; 
     int gap_; 
}; 

#endif 

我注意到有動態分配的內存,但我沒有在任何地方看到delete ......這是一個問題嗎?如果這是一個問題,我該如何解決這個問題?

Thnx任何幫助!

P.S.

我注意到,沒有在此示例中使用關鍵字class?...你能像這樣定義一個類?

+1

貌似3內存泄漏給我! –

+0

+1我也這麼認爲:D thnx的確認! – jjepsuomi

+2

在析構函數中需要3個'delete [] ...'。 –

回答

5

這是不可能沒有看到類定義( 頭)的說法;如果size_等都是類似 boost::shared_array,或std::unique_ptr,沒有泄漏。 如果他們只是int*,就有泄漏。

當然,沒有C++程序員會寫這種代碼 反正。該課程將包含std::vector<int>std::string。從我們在這裏看到的來看,作者 不知道C++。

+0

+1 @JamesKanze感謝您的幫助,我包含了代碼的頭文件。這是你的意思嗎? =) – jjepsuomi

+1

@jjepsuomi是的。正如我懷疑的那樣,所討論的變量是原始指針,所以它會泄漏。 marcin_j關於不遵守三的規則的觀點基本上也是正確的,但是如果你使用'std :: vector'和'std :: string'(或者智能指針),你會自動獲得深層複製語義(或者你可能會想要禁用複製和分配---如果該類表示某個外部實體,則通常不想支持它們)。 –

1

另一個問題是,你的代碼不服從三(鏈接herehere

第一次,你會寫這樣的代碼:

{ 
PlacementHead a(0,0,0,"asdsa"); 
PlacementHead b(0,0,0,"asdsa"); 
a = b; // line 1 
} // here segfault 

你會得到段錯誤,在line 1,指針會從b複製到a,一旦你最終有析構函數,指針將被刪除兩次,這是錯誤的。這被稱爲淺拷貝,你需要深拷貝,在那裏分配新的數組。

1

代碼已經泄漏。構造函數分配內存.Destructor或其他一些功能必須清理之前的對象被銷燬