5

私の C++ クラスには、std::vector および std::array インスタンス変数を削除しようとするデストラクタがあります。

#include <iostream>
#include <vector>
#include <array>

int main()
{
    std::array<int, 3> foo;
    std::vector< std::array<float, 4> > vertices;

    foo[0] = 1;
    foo[1] = 2;
    foo[2] = 3;
    std::cout << foo[0] << std::endl;
    delete foo;
    delete vertices;

    return 0;
}

メモリを適切に解放する方法がわかりません - なぜこれらの変数を削除できないのですか?

clang++ -std=c++11 -stdlib=libc++ -Weverything ccc.cpp 
ccc.cpp:14:2: error: cannot delete expression of type 'std::array<int, 3>'
        delete foo;
        ^      ~~~
ccc.cpp:15:2: error: cannot delete expression of type 'std::vector<std::array<float, 4>
      >'
        delete vertices;
        ^      ~~~~~~~~
ccc.cpp:18:2: warning: C++98 requires newline at end of file [-Wc++98-compat-pedantic]
}
 ^
4

1 に答える 1

23

これらの変数を削除しますか? 必要な唯一の「変数」deleteは、によって割り当てたものですnewnewこのコードで何かを割り当てましたか? いいえ、だから、delete何もしようとするのをやめてください。

オブジェクトfooとは、自動保存期間verticesを持つローカル オブジェクトです。これらのオブジェクトのメモリは自動的に割り当てられ、自動的に解放されます。あなたはそれを自分で行うことはできません。これは完全に制御不能です。

メモリ割り当てを手動で制御したい場合は、 を使用してこれらのオブジェクトを動的に作成する必要がありますnew。例えば

std::array<int, 3> *foo = new std::array<int, 3>();
...
(*foo)[0] = 1;
(*foo)[1] = 2;
(*foo)[2] = 3;
...
delete foo;

上記は機能します。しかし、例に動的メモリを含める本当の理由はありません。自動オブジェクトでは、そのままで問題なく動作します。それらを試みるのをやめてdeleteください。

delete引数としてポインターが必要です。を介してオブジェクトを割り当てる場合new、ポインタを介してこれらのオブジェクトにアクセスします。これらのポインターは、後でdeleteそのようなオブジェクトを破棄するために渡すものです。このコードでは、これはどれも当てはまりません。

于 2013-09-22T05:00:28.070 に答える