2014-11-04 37 views
-3

我已經寫了一個類來習慣C++。當我嘗試刪除對象時,調試器用_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)拋出「Debug As thesis Failed」。調試As thesis失敗 - 找不到錯誤代碼

也許有人可以告訴我我的錯誤在調試所有內存地址接縫罰款。

Lines.h

#ifndef LINES_H 
#define LINES_H 
#include <stdio.h> 
#include <iostream> 
using namespace std; 
class Lines 
{ 
public: 
    Lines(int _laenge) : fuellzeichen{ '#' }, name{ "Hans-Peter" }, laenge{ _laenge }{}; 
    Lines(int _laenge, char _fuellzeichen) : fuellzeichen{ _fuellzeichen }, laenge{ _laenge }, name{ "Hans-Peter" }{}; 
    Lines(int _laenge, char _fuellzeichen, char* _name) : fuellzeichen{ _fuellzeichen }, laenge{ _laenge }, name{ _name }{}; 
    Lines(const Lines& _l); 
    ~Lines(); 
    Lines& operator= (const Lines & _l); 
private: 
    char fuellzeichen; 
    int laenge; 
    char* name; 
}; 


#endif // LINES_H 

Lines.cpp

#include "Lines.h" 

Lines::Lines(const Lines& _l){ 
    fuellzeichen = _l.fuellzeichen; 
    laenge = _l.laenge; 
    int len = strlen(_l.name) + 1; 
    name = new char[len]; 
    strncpy(name, _l.name,len); 
} 
Lines& Lines::operator=(const Lines& _l){ 
    if (this == &_l){ 
     return *this; 
    } 
    Lines tmp(_l); 
    swap(fuellzeichen, tmp.fuellzeichen); 
    swap(name, tmp.name); 
    swap(laenge, tmp.laenge); 
    return *this; 
} 
Lines::~Lines(){ 
    delete[] name; 


} 

的main.cpp

#include "Lines.h" 

    int main(int argv, char* args[]){ 
     Lines a(20,'#'); 
     Lines b(a); 
} 
+2

用'std :: string'替換'char * name'並將所有pr oblems將消失。您不需要再定義自己的拷貝構造函數,賦值運算符或析構函數。 – 2014-11-04 17:39:00

回答

2

不要delete []你沒有new []

Lines(int _laenge) : fuellzeichen{ '#' }, name{ "Hans-Peter" }, laenge{ _laenge }{}; 
Lines(){ delete[] name; } 

在上述兩行看看:

  • 的男星點name字符串字面"Hans-Peter"
  • dtor delete [] s不管name指向。

的最簡單有效的補救辦法是使用std::string,而不是做自己的內存管理。
這也可以讓你遵循0的規則而不是3的規則。

還有另外一個錯誤,或至少錯誤等待到發生:你的一個參數,構造函數應該是explicit,所以它不被視爲對隱式轉換。

另外,考慮使用默認參數來簡化代碼。
此外,使用const酌情:

explicit Lines(int _laenge, char _fuellzeichen = '#', const char* _name = "Hans-Peter") 
     : fuellzeichen{_fuellzeichen}, laenge{ _laenge } { 
    int len = strlen(_name)+1; 
    name = new char[len]; 
    memcpy(name, _name, len); 
}; 

當你正在使用分配複製和交換,考慮寫自由功能swap和按值傳遞:

Lines& Lines::operator=(Lines _l) { swap(this, &_l); return *this; } 
void swap(Lines& a, Lines& b) { 
    using std::swap; 
    swap(a.fuellzeichen, b.fuellzeichen); 
    swap(a.name, b.name); 
    swap(a.laenge, b.laenge); 
} 

~Linesoperator=應該在類中定義,並且必須在該頭中聲明swap。)

+0

刪除downvote-您在我downvoted +評論後擴展您的答案。 – cybermonkey 2014-11-04 17:42:04

相關問題