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

这取决于你的内存是如何分配的。

对于您粘贴的代码:

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 的析构函数中编写自由/删除代码。并将 a 放入由 {} 包装的范围内,当 a 超出范围时将调用析构函数(由 c++ 编译器自动完成)。就像提到的@Alok 和@Luchian 一样。

  • 如果您的内存以成员变量的形式分配,如下所示:

    A类{ char foo[16]; };

    当代码为A a; “foo”时,作为 A 实例的一部分在堆栈上分配。你不能做任何事情。

    当代码是A *pa = new A(); 然后在 A 上分配对象时,请随意删除它。 delete pa;

于 2012-12-10T13:23:55.003 回答