2

const std::vector を返す 1 つのライブラリ API を使用しています。以下はコードです

const std::vector<unsigned char> myvar = getData();

これで、myvar のメモリがクリーンアップされました。C++ でこれを行う方法。

私は次のようなことを試みています

std::for_each(myvar.begin(), myvar.end(), [&](unsigned char mychar)
{
    cout<<mychar<<",";


    delete &mychar;

});

しかし、ヒープ破壊で失敗します。

入力していただきありがとうございます。

4

3 に答える 3

5

STL はRAII イディオムを使用し、必要に応じてメモリを割り当て、自動的に割り当てを解除します。

手動で deallcoate する必要はありません。範囲外にmyvar放すだけmyvarで、すべてのメモリが自動的に割り当て解除されます。

// new scope, maybe function, maybe if/while scope: 
{
    const std::vector<unsigned char> myvar = getData();
}
// myvar will be deallocated 

常にペアで を呼び出すことに注意してください。new/deleteどのnew [] / delete[]メンバーに対しても new を呼び出さなかったので、myvarcall はまったく必要ありませんdelete

于 2013-02-04T08:02:45.477 に答える
2

そのベクターの内容を手動で削除する必要はありません。ベクターのデストラクタは、必要なすべてのメモリ割り当てを処理し、オブジェクトがスコープ外になったときに呼び出されます。例えば、

{

  const std::vector<unsigned char> v('a', 1000); // size 1000 vector

} // v's destructor called here.

これは、標準ライブラリ型を使用する多くの理由の 1 つです。リソースの取得は初期化、または RAIIというあまり適切な名前ではありません。

于 2013-02-04T08:02:55.260 に答える
2
void myFunc()
{
    const std::vector<unsigned char> myvar = getData();

} // <----- Like this

ベクターは、それを含むスコープの最後で破棄されると、自身のコンテンツの割り当てを解除します。覚えていないdelete限り、する必要はありませんnew

于 2013-02-04T08:03:12.200 に答える