2011-12-19 8 views
2

私はocted_stringという名前のクラスを作成しましたが、デストラクタはうまく動作しませんでしたが、関数でocted_string型を返すことができませんでした。C++のデストラクタについて

下記のコードを見て、何が間違っているか教えてください。

私はそれが動作するデストラクタを削除します! (cout print 12)

いずれかの助けができますか?

octed_string(const octed_string &_input) 
    :value(0),length(0),allocated(0) 
{ 
    while(length<_input.length) 
    { 
     this->add((uchar_t)_input[length]); 
    } 
} 

octed_string& octed_string::operator= (octed_string const& _in) 
{ 
    octed_string tmp(_in); 
    return *this; 
} 

class octed_string 
{ 
private: 
    uint8_t *value; 
    size_t length; 
    size_t allocated; 
public: 
    octed_string()//constructor 
     :value(0),length(0),allocated(0) 
    { 

    } 
    void copy(uint8_t *from, uint8_t *to) 
    { 
     for (size_t i = 0; i < length; i++) 
      *to++ = *from++; 
    } 

    void allocate() 
     { 
      if (value == 0) 
      { 
       allocated = STACK_INITIAL_ALLOC; 
       value = new uint8_t[allocated]; 
      } 
      else 
      { 
       // We need to allocate more memory 

       size_t new_allocated = allocated + STACK_CHUNK_ALLOC; 
       uint8_t *new_value = new uint8_t[new_allocated]; 

       // Copy from old stack to new stack 
       copy(value, new_value); 

       // Delete the old value 
       delete [] value; 

       allocated = new_allocated; 
       value = new_value; 
      } 
     } 

    ~octed_string()//destructor 
    { 
     if(value) 
      delete [] value; 
    } 

    friend ostream &operator<<(ostream &_output,const octed_string &_str)//opration overloading for cout 
    { 
     for(int i=0;i<_str.length;i++) 
      _output<<(uchar_t)_str.value[i]; 
     return _output; 
    } 

    void add(uint8_t input)//this function automatically add space to value (new) 
    { 
     if (length == allocated) 
      allocate(); // Allocate more memory 

     value[length++] = _value; 
    } 

    octed_string sub_string(int start,int end)//(this function has a problem with destructor i think because it return octed_string) 
    { 
     octed_string a; 
     for(int i=start;i<end;i++) 
      a.add(a); 
     return a; 
    } 
}; 

void main() 
{ 
    octed_string o; //object 
    o.add(1); 
    o.add(2); 
    o.add(3); 

    cout<<o.sub_string(0,2); //i expect printing 12 but i does not! 
} 

----------------------- //答え おかげで、次のコードを追加することによって、それが修正phresnelします

しかし、私はまだ理由を理解できません。どのような身体もこの問題を学ぶための参考資料を提示することができますか?

+0

問題がおそらくそこにあるので、あなたはadd()にあるものを正確に表示する必要があると思います。 – Julian

+0

あなたは最も重要なコードを逃したようです: 'add'メソッド。 –

+0

これは実際にあなたのコードのすべてですか?あなたのadd関数は何もしません。 –

答えて

11

octed_stringのコピーコンストラクタと代入演算子を定義する必要があります。メンバ変数valueに割り当てられたメモリが破壊され、デフォルトのコピーコンストラクタによって構築されたコピーは、元の、今破壊され、オブジェクトがやったのと同じ削除されていないメモリを指していないので、あなたはそれが動作デストラクタを持っていない

デストラクタを使用すると、メモリが削除されます。

sub_string()が返されたときにコピーが作成されます。

+1

それでは十分ではありません。彼はまた、良いコピー割り当てを持たなければなりません。 –

+0

@phresnel、正しい。更新しました。 – hmjd

1

考えられる理由:

  • タイプミス:あなたはsub_stringはなく、sub_stirngを宣言しました。
  • 実装がありません:それは何かを割り当てる必要がありますあなたのadd()機能は
    • 空のですか?あなたはうまく設計されたコピーコンストラクタを持っているし、割り当てをコピーしないでください
  • :あなたの文字列オブジェクトが周りにコピーされると
    • 、コピーの1つは、値バッファ欠落
  • deleteますあなたのvalueバッファの割り当て。
    • あなたは他のすべての
  • であなたのvalue -buffer用のメモリを割り当てられていません。

実際のコードがなければ、本当に良い答えは得られません。

1

達成しようとしていることは何ですか?それはstd :: stringを使って達成できないものですか?

コメントの数:

1追加の中でどのように新しい値を追加しますか?あなたはコンストラクタ例えばコピーを定義する必要が

2プレフィックスのアンダースコア(_output)エリアは悪い考え

3:

// Assuming value is an array 
octed_string::octed_string(const octed_string& rhs) 
    : value(rhs.value ? new uint8_t[ rhs.length ] : 0) 
    , length(rhs.length) 
    , allocated(rhs.allocated) 
{ 
} 

4あなたはまた、任意の

octed_string& octed_string::operator= (octed_string const& f) 
{ 
    octed_string tmp(f); 
    std::swap(tmp, *this); 
    return *this; 
} 
0

代入演算子を必要としますクラスのメンバ変数にポインタ型があり、コピーコンストラクタ、オーバーロードされた演算子=、デストラクタが必要です。 2行目

octed_string str1; // suppose this is initialized as desired 

octed_string str2 = str1; 

、コンパイラ生成されたコピーコンストラクタが呼び出され、そのコピーメンバー一つずつ:

は、次のコードを考えてみましょう。ここではvalueという名前のchar_t *メンバーがあります。したがって、str2の値はstr1の同じメモリ位置を指しています。これは浅いコピーと呼ばれます。この場合、str1とstr2の両方がvalueと同じメモリ位置を共有します。これにより、str1がスコープ外に出た場合にポインタがぶら下がります。次のコードは、この事実の可能性のある状況を示しています。

octed_string test() { 
    octed_string str; 
    // Initialize str... 
    return str; 
} 

同じ物語がオブジェクトの割り当てに適用されます。

関連する問題