2017-11-20 8 views
-1

私はこれをかなりの間苦労してきました。これはインターネット上にある単純な「C String」実装の始まりです。しかし、鉱山は機能しません... ~CString()に達し、delete[] _data;と呼ぶとクラッシュします。どうしてか分かりません。C++ 'C String'実装にメモリ割り当ての問題があります

ここCString.h

#ifndef CSTRING_H 
#define CSTRING_H 

#include <cstring> // strlen 

class CString 
{ 

    char* _data; 
    unsigned int _size; 
    unsigned int _length; 

public: 
    CString(); 
    CString(const char* data_); 
    CString(const char* data_, unsigned int size_); 
    CString(const CString& other_); 

    ~CString(); 

    const char* get_data() const; 
    unsigned int get_size() const; 
    unsigned int get_length() const; 

    void assign(); 
    void assign(const char* data_); 
    void assign(const char* data_, unsigned int size_); 

}; 

#endif // CSTRING_H 

がCString.cpp

#include "./CString.h" 

CString::CString() 
{ 
    _data = 0; 
    _size = 0; 
    _length = 0; 
} 

CString::CString(const char* data_) 
{ 
    _size = strlen(data_) + 1; 
    _length = strlen(data_); 
    _data = new char(_size); 
    strncpy(_data, data_, _size); 
} 

CString::CString(const char* data_, unsigned int size_) 
{ 
    _size = size_; 
    _length = size_; 
    _data = new char(_size); 
    strncpy(_data, data_, _size); 
} 

CString::CString(const CString& other_) 
{ 
    _size = other_._size; 
    _length = other_._length; 
    _data = new char(_size); 
    strncpy(_data, other_._data, _size); 
} 

CString::~CString() 
{ 
    if (_data) 
    { 
     delete[] _data; 
    } 
} 

const char* CString::get_data() const 
{ 
    return _data; 
} 

unsigned int CString::get_size() const 
{ 
    return _size; 
} 

unsigned int CString::get_length() const 
{ 
    return _length; 
} 

void CString::assign() 
{ 
    if (_data) 
    { 
     delete[] _data; 
    } 
    _size = 0; 
    _length = 0; 
    _data = 0; 
} 

void CString::assign(const char* data_) 
{ 
    if (_data) 
    { 
     delete[] _data; 
    } 
    _size = strlen(data_) + 1; 
    _length = strlen(data_); 
    _data = new char(_size); 
    strncpy(_data, data_, _size); 
} 

void CString::assign(const char* data_, unsigned int size_) 
{ 
    if (_data) 
    { 
     delete[] _data; 
    } 
    _size = size_; 
    _length = size_; 
    _data = new char(_size); 
    strncpy(_data, data_, _size); 
} 

され、最終的に、ここにすべてのmain.cppにはやっているです。ここです:

int main(int argc_, char** argv_) 
{ 
    CString info_message("Hello world!"); 
} 

これはそのように思える簡単な仕事ですが、私は数時間それに固執してきました!たぶんそれは誰か他の人に困惑しているのでしょうか、それとも本当に簡単な修正です。知りません。事前に助けてくれてありがとう。

+0

'CString'の代入演算子がありません。 'CString message2;を実行した場合、問題があることがわかります。 message2 = info_message; ' – PaulMcKenzie

答えて

4
_data = new char(_size); 

これは、値が_sizeの1文字を作成しています。

_data = new char[_size]; 

これはおそらく必要なものです。これは、全長が_sizeの文字の配列を作成します。

0

あなたは

_data = new char[_size]; 

_data = new char(_size); 

を交換しようとしたことがありますか?

私が間違っていない場合、[]は通常、配列を初期化するときに使用されます。

関連する問題