2012-05-11 54 views
0
#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <iomanip> 
#include <string> 

using namespace std; 

int main() 
{ 
    ostringstream out; 
    ostringstream tmpstr; 
    tmpstr << "ritesh is here"; 
    out << tmpstr.str().c_str(); 
    out << endl; 
    cout << out.str(); 
    if(tmpstr.rdbuf()!=NULL) 
     cout << "tmpstr not null" <<endl; 
    else 
     cout << "tmpstr null" <<endl; 
    delete tmpstr.rdbuf(); // This line gives me segmentation fault 
    cout <<"deleted" << endl; 
} 

delete tmpstr.rdbuf();は、セグメント化エラーを示します。私はrdbufがchar *ポインタを返すと思います。私はそれに割り当てられたメモリ空間を解放するために削除を使用することができますtmpstr私のコードのようにストリングストリームオブジェクトを削除すると、セグメンテーションフォルトが発生するのはなぜですか?

私は間違ってどこか?

+2

[Resource Acquisition is Initialization](http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)。それを知っている。大好きです。 –

+0

@EdS:良いアドバイスをしていますが、ここでどのように適用されるのか分かりません。 –

+2

@ JohnDibling:これは 'std :: string'がどのように動作するかを示します。あなたが理解すれば、あなたはここで何かに 'delete'を呼び出す必要はないことを理解するでしょう。これは、OPが求めているものよりも高いレベルのコンセプトですが、 'string'や' vector'などを使うつもりなら、何が起こっているのかを理解する必要があります。 –

答えて

7

はい、間違っていると思います。delete割り当てられていないものです。

delete自分で持っているものはnewです。他の人のものはdeleteしないでください。

+0

Nitpick: 'new'で割り当てられたものだけを削除します。あなたが書いていない関数は、あなたが掃除を担当しているメモリを割り当てていることがあります。あなたが 'new'を呼び出さなかったからといって、あなたが' delete'を呼び出さないということを意味するわけではありません。 –

+4

* "他の人のものを削除しないでください" *文書で明示的に*指示していない限り*。 –

+0

@Als:これは私が手に入れたものです:D –

関連する問題