0

私は次のようなコードを持っています:

class A{
public:
void method1 (){
// do something
}
};

class B{
public:
void method2 (){
// do something
}
};

main(int argc, char* argv[])
{
A a ;
a.method1();
// free object a
B b ;
b.method2();
}

ここで、bオブジェクトを作成する前に、aによって割り当てられたメモリを解放したいと思います。誰かが私にそれをする方法を手伝ってもらえますか?

4

4 に答える 4

6

{追加のスコープ,}を追加するだけで済みます。aは自動/ローカル オブジェクトであるため、宣言されているスコープが終了すると自動的に破棄されます。

main(int argc, char* argv[])
{
    {                    //<--------------
        A a ;
        a.method1();
    }                    //<-------------
    B b ;
   b.method2();
}

これは、一般に C++のRAIIとしても知られています。

于 2012-12-10T12:34:11.893 に答える
4

これを行う必要がある場合は、まずこれがコードのにおいであることを指摘する必要があると思います。オブジェクトの破棄は、新しいオブジェクトが作成されるための前提条件であってはなりません。もしそうなら、それを抽象化する方が良いでしょう。

ただし、次のようになります。

main(int argc, char* argv[])
{
   {
      A a ;
      a.method1();
   }// free object a
   B b ;
   b.method2();
}
于 2012-12-10T12:33:56.017 に答える
0

新しいスコープと自動オブジェクトを使用する必要がありますが、動的割り当てを使用してそれを行う方法の例もここにあります。

main(int argc, char* argv[]) {
    A* a = new A();
    a.method1();
    delete a;

    B* b = new B();
    b.method2();
    delete b;
}
于 2012-12-10T12:34:17.340 に答える
0

それは、aによってメモリがどのように割り当てられるかによって異なります。

貼り付けたコードの場合:

g++ -gstabs -o a cpptest.cpp 
objdump -d ./a


0000000000400554 <main>:
  400554:   55                      push   %rbp
  400555:   48 89 e5                mov    %rsp,%rbp
  400558:   48 83 ec 20             sub    $0x20,%rsp
  40055c:   89 7d ec                mov    %edi,-0x14(%rbp)
  40055f:   48 89 75 e0             mov    %rsi,-0x20(%rbp)
  400563:   48 8d 45 ff             lea    -0x1(%rbp),%rax
  400567:   48 89 c7                mov    %rax,%rdi
  40056a:   e8 13 00 00 00          callq  400582 <_ZN1A7method1Ev>
  40056f:   48 8d 45 fe             lea    -0x2(%rbp),%rax
  400573:   48 89 c7                mov    %rax,%rdi
  400576:   e8 11 00 00 00          callq  40058c <_ZN1B7method2Ev>
  40057b:   b8 00 00 00 00          mov    $0x0,%eax
  400580:   c9                      leaveq 
  400581:   c3                      retq   

この正確なケースでは、オブジェクト a/b のメモリはスタックにあります。によって割り当てられた

400558:   48 83 ec 20             sub    $0x20,%rsp

クラスにメンバー変数がないため、クラスのインスタンスは 1 バイトを消費します (クラスのインスタンスを区別するために C++ コンパイラによって行われます)。

a の「this」ポインターが _ZN1A7method1Ev (method1) に転送されていることがわかります。

  400563:   48 8d 45 ff             lea    -0x1(%rbp),%rax
  400567:   48 89 c7                mov    %rax,%rdi

この正確なコード ケースでは、b の前に a のメモリ (スタック上) を解放する必要はなく、解放することもできません。

  • Aによって割り当てられたメモリを意味する場合は、 malloc/new によって。次に、A のデストラクタに free/delete コードを記述する必要があります。{} でラップされたスコープに a を配置すると、スコープ外のときにデストラクタが呼び出されます (これは C++ コンパイラによって自動的に行われます)。@Alokと@Luchianが言及したように。

  • 次のように、メモリがメンバー変数の形式で割り当てられている場合:

    クラス A{ char foo[16]; };

    code がA a; A のインスタンスの一部として "foo" がスタックに割り当てられている場合、何もできません。

    コードがA *pa = new A(); A に割り当てられている場合は、自由に削除してください。 delete pa;

于 2012-12-10T13:23:55.003 に答える