2011-12-23 9 views
2

私は自分自身の文字列クラスを作成しようとしています(詳細は覚えています)。その間、charデータがどのように削除されているか、プログラムは文字列のデストラクタが呼び出されます閉じてたときにそこにデータcharを削除する際にメモリ例外が発生するのはなぜですか?

#include <string.h> 

template<typename T> 
class String 
{ 
protected: 
    T* mData; 

public: 
    String(const T* data); 
    ~String(); 
}; 

template<typename T> 
String<T>::String(const T* data) 
{ 
    if(data != NULL) 
    { 
     mData = new T[strlen(data)]; 
     strcpy(mData, data); 
    } 
} 

template<typename T> 
String<T>::~String() 
{ 
    if(mData != NULL) 
    { 
     delete [] mData; 
     mData = 0; 
    } 
} 

int main(void) 
{ 
    String<char> Test("Test"); 

    return(0); 
} 
あなたは一つのアイテムが少なすぎる、strcpyのコピーNUL終端バイトを割り当てている
+1

削除する前にNULLをテストする必要はありません(または値を0に設定する必要はありません)。 –

+1

あなたは3つのルールに従う必要があります。そうしないと、最初のコピーの後にクラッシュします。 –

+0

あなたは正しいです、私は3つのルールに違反していました(私は単純なテストケースを持っていました) – judeclarke

答えて

5
mData = new T[strlen(data)]; 
     strcpy(mData, data); 

を削除するには、ヒープエラーになるだけでなく、されます文字列

+0

それはまさにそれでした。お手伝いありがとう。 – judeclarke

0

strcpの代わりに "memcpy"と "memset"関数を使うべきですY:

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

+0

なぜこれはそうですか? – judeclarke

+0

'memcpy'関数を使うと、メモリブロックの処理が高速になります。また、 'strcpy'は、あなたのケースでオーバーフローが発生する可能性があるため安全ではありません。安全である 'strlcpy'関数があります。メモリブロック機能を使用すると、完全なメモリ制御が可能になります。個人的には、テンプレート(generic)を使用するのではなく、同じ汎用抽象クラス(インターフェース)から継承するchar型のwchar_t型と、char型の2つの文字列クラスターを好むでしょう。 – ArBR

0

あなたは、new演算子は、あなたのコンストラクタで例外をスローに注意する必要があります。その場合は、データポインタをnullptrに初期化してください。otherwize、デストラクタが呼び出され、ランダムアドレスを削除しようとする必要があります。

#include <cstring> 

template<typename T> 
class string { 
    protected: 
     T * data_; 
    public: 
     string(T const * data); 
     ~string(); 
}; 

template<typename T> 
string<T>::string(T const * data) 
try { 
    if(!data) data_ = 0; 
    else { 
     data_ = new T[std::strlen(data) + 1]; 
     std::strcpy(data_, data); 
    } 
} catch(...) { 
    data_ = 0; 
} 

template<typename T> 
string<T>::~string() { 
    delete[] data_; 
} 

int main() { 
    string<char> test("test"); 
    return 0; 
} 
関連する問題