2016-08-13 12 views
3

newまたはスマートポインタがメモリのサイズを必要とすると思います。クラスにstringが含まれている場合は、そのクラスを割り当てます。次に、文字列に新しい値を割り当てます。それはメモリ上にありますか?この例では文字列を含む新しいクラスへのポインタを作成する

// a.hpp 
#include <string> 
#include <memory> 
#include <armadillo> 

class A { 
public: 
    A(const std::string &); 
private: 
    struct Impl; 
    std::shared_ptr<Impl> impl; 
}; 

// a.cc 
struct A::Impl { 
    Impl(const std::string &f) 
    { 
    // read config file and get name and size of x 
    name = "abc"; 
    x.zeros(2, 3); 
    } 

    std::string name; 
    arma::mat x; 
}; 

A::A(const std::string &f): 
    impl(std::make_shared<Impl>(f)) {} 

、私は私だけNメモリを割り当てると思いますが、私はN+Mメモリを使用します。それは危険ですか?

+0

'std :: string'は、値を格納するために必要なメモリを割り当てます。それが終わったら解放してください。何もする必要はありません。 –

+0

オブジェクトをスタックまたはヒープ上に作成する場合、Bo Perssonはstringのコンストラクタは、デフォルトの初期化または文字列の提供を問わず、文字列オブジェクトの初期化を行う方法を問わずメモリを割り当てます。値を変更すると、後でメモリが再割り当てされます。あなたが再配分の問題を気にするかどうかは、あなた次第です。私が間違っているなら、誰かが私を修正してください。 – TimLayne

+0

あなたはコンストラクタを提供していましたが、Pimplの構造体のためのデフォルトのコンストラクタは提供されていなかったので、その値を割り当てておく必要があります。 – TimLayne

答えて

1

std::stringの代入演算子は、必要なすべてのメモリ割り当てを処理します。その点を心配する必要はありません。

+0

誰かがメモリ消費、割り当てなどに興味があるなら、メモリ使用量はコアクラスオブジェクトよりも高いです。しかし、多分この知識はあらゆる状況で必要とされるわけではない –

0

トールジョーンズの答えが素晴らしいです。私はいくつかの追加ポイントを追加するだけです。

文字列クラス自体には、sizeofから得ることができる一定の値が必要です。それはあなたが実際に自分のクラスに保管しているものです。次に、文字列に格納されたデータの場合、から、という文字列オブジェクト(これは通常、文字列の開始点になるはずですが、私はそれについて確信しています)によって導出されます。だから、あなたはそれについて心配する必要はありません、標準ライブラリはすでにラップされているあなたのためです。

関連する問題