2016-11-18 9 views
3

私はC++を初めて使い、Delphiから来ています。Arduinoボード上でのC++のメモリ管理

は、私は右のそれ

Object* obj = new Object(); 

は、ヒープ上に作成され、それが、これは正しいです

void foo(Object* bar) 
{ 
    // bar is still the same pointer to "obj" (which I created above) on the heap? 
} 

foo(obj); 

場合、私はまた、メモリのクリアランスのための

delete obj; 

を呼び出す必要がありアム右?

+4

これは正しいようです。 – Jiminion

+0

はい、すべてが順番になっているようです(「メモリクリアランス」は本当に私たちが使用する用語ではありません)。あなたがメモリリークを避けるためにあなたが '新しく'必要なものはすべて、ポインタを介してオブジェクトに関数を渡すことは、関数が同じオブジェクトにアクセスすることを意味します。 – UnholySheep

+1

私が理解しているように、C++は「自動」と「動的」メモリを使用し、用語ヒープ/スタックは使用しません。 –

答えて

4

I右のそれ

Object* obj = new Object(); 

はヒープ

はいっぽい上に作成されています。動的メモリストア内に作成され、ヒープであってもなくてもかまいません。私はArduinoを知らないが、おそらくヒープです。 C++標準では、どのような記憶方法が使用されているかにかかわらず、観察可能な動作が同一であることが保証されているため、ほとんどの場合、用語の問題です。同じことがスタックにも適用されます。 C++は、指定された動作をしている限り、自動ストレージに使用するものを気にしません。

バーは、ヒープ上の "obj"(これは私が作成したもの)とまったく同じポインタですか?

はい、誰でもその違いを伝えることが不可能な場合、コンパイラはすべての種類の楽しいゲームをバックグラウンドでプレイすることができます。これは、「そのまま」ルールと呼ばれます。 What exactly is the "as-if" rule?

これが正しければ、私はまた、メモリのクリアランス右用

delete obj; 

を呼び出す必要がありますか?

用語niggle(空白は何らかの種類の空白パターンでメモリを上書きすることを意味します。あなたはそれを解放しています)があります。誰かがメモリを退出時にあなたや実行時に戻さなければなりません。通常は、メモリや他のリソースの漏洩を防ぐために行うのが最善です。

あなたは解放されたメモリがあなたの心配であるとは限りません。プロセスが終了した後でもオブジェクトが保持される外部共有リソースを表す場合はどうなりますか? Sucks tioは、何かがロック解除されなかったためにサーバーを再起動する必要があります。 C++の重要な要素の1つはRAII(What is meant by Resource Acquisition is Initialization (RAII)?)で、この問題のイデオロギー的な解決策です。

スマートポインタを使用してプロセスを自動化することもできます。 What is a smart pointer and when should I use one?

他の重要な点:多くの他の言語とは異なり、newのオブジェクトはありません。ほとんどの場合、単純なObject obj;が正しい選択になります。objが一時記憶域に作成され、ランタイムは範囲外になったときにobjを破棄します。それを正しく指定すると、決して問題はありません。しかし、正確な範囲が何であるかを決める際に問題があるかもしれません。

+0

お返事ありがとうございました。実際、私はスマートなポインタについて知っていましたが、C++の「怖がっていた」(これは実際には恐ろしいことです)というのは、あまりにも複雑になるので、私の最初のやり方はそれを使いたくないということでした。しかし、今私はそれがほとんどそれを持っていると思う! 「新しい」というものが必要ではないという部分だけが今私にとって混乱しています。しかし、私はそれを見ていただきありがとうございます! – MaxMadman