2017-01-25 25 views
1

私はC++を起動していると私は私のコードがどのように機能するかを理解することはできません。C++のメモリ割り当てHOWTO

[OK]を私はメモリを割り当てますが、割り当て誰の時に割り当てられるメモリのサイズを知っています。しかし、コードはまだ動作します。 どのくらいのメモリが割り当てられていますか?どのくらいのメモリが必要ですか?

EDIT:私の質問は明確ではなかった場合

申し訳ありません。それを明確にしてみてください。だから私は動的に私のポインタを使ってヒープ内のいくつかのメモリを割り当てます。しかし、スティング変数にはテキストがないので、私はgetl​​ine経由で入力するテキスト(バイト)の量を知ることはかなり難しいと思っています。

2つの異なるテキストリテラルのサイズを尋ねてみましたが、サイズはそれぞれ異なります。

sizeof("") // is 1 (because of the ending 0 maybe?) 
sizeof("sometext") // is 9 

しかし、文字列の場合、sizeofは私に両方の時間を与えます。 sizeof()が文字列を指すポインタの長さを与えることは明らかです。

どのようにしてメモリを割り当てることができますか?新しい文字列にメモリを割り当てると、文字列の最初の文字のメモリアドレスを指すポインタにのみ割り当てられますか?明らかに私が入力する文字は、どこかに格納しなければなりません。そして私は最初にメモリを割り当ててから、テキストを読み込みます。

編集2:プレーンテキストではなく、コードを編集するように編集したコードを作成します。

//Edit:  
string a,b = "sometext"; 
    cout << sizeof(a) << endl; //4 
    cout << sizeof(b); //4 

//-------------------------------------------------------- 

#include <iostream> 
#include <string> 
#include <exception> 



using namespace std; 

int main() 
{ 
    //Defining struct 
    struct musicCD 
    { 
     string artist, title; // artist of the CD 
    }; 
    //Memory allocation 
    musicCD *ptr; 
    try{ptr = new musicCD;} 
    catch(bad_alloc){cerr << "Out of memory :(";return -1;} 
    catch(...){cerr << "Something bad happened :O !";return -1; 
    } 

    //Get the data to store: 
    cout << "Please enter the data for the CD!' " << endl; 
    cout << "Please enter the artist: ";getline(cin, ptr->artist); cout << endl; 
    //Write out the data 
    cout << "The data entered: " << endl; 
    cout << "The artist performing is: \t" << ptr->artist << endl; 

    delete ptr; 
    return 0; 
} 
+10

「あなたは割り当てられたメモリのサイズを知っている人はいません」と信じるようになったのは何ですか?それは非常に明白です。 'musicCd'オブジェクトの1つのインスタンスに対する十分なメモリが必要でした。割り当てられた後、割り当てが解除されました。 –

+1

_誰も、割り当てられるメモリのサイズを知っていません。そうではありません。 'musicCD'は固定サイズです(サイズを見るには' sizeof'を使います)。 –

+1

私は標準的な考えを信じていませんが、音楽CDのサイズは新しく決められています。サイズを得るための標準的な操作があります。例えば、 'sizeof(musicCD)' – George

答えて

2

あなたがstd::string、または任意の動的なコンテナは、それがメモリ要件が所定されていないという事実をどのように扱うかについて混乱しているように思えます。例えば、std::stringではありません。は内部的に文字データを格納します。簡単に言えば、を指すポインタ、実際のデータを含むの動的割り当てバッファを含んでいます。 std::stringには、実際の文字データを含む余分なバッファを自動的に管理するデストラクタと代入演算子であるコンストラクタがあります。これには、再割り当て、データのコピー、内部ポインターの更新、余分なストレージが必要な場合は以前のバッファの解放が含まれます。実際のデータを含むバッファのサイズは、ではなく、のサイズは、std::stringの数に数えます。すべてのインスタンスstd::stringは、その存続期間を通じて、すべて一定のサイズを持つ一定数のメンバーのみを直接的に含みます。 C++では、すべての型にコンパイル時定数があります。

stringの簡略化された実装については、Rule of fiveを参照してください。この例のクラスrule_of_fiveのサイズは、このポインタが指すバッファの内容にかかわらず、単純にchar*のサイズです。実際のバッファは、オブジェクト自体の初期割り当てが既に終了した後に、構築中または作成後に割り当てられます。

編集:非常に短い文字列を扱うときに、文字列が文字データを内部的に格納できる場合があります。これは他のコンテナには一般的に見られない最適化です。 this answerを参照してください。