繁体   English   中英

如何释放“ new”分配的内存,但不显式引用相应的指针

[英]How to free up memory allocated by “new”, but without referencing corresponding pointer explicitly

我的应用程序有2个状态,例如foo和bar。 每个状态都有一些对象,但是由于它们在内存方面很大,因此我想在进入状态时使用新对象创建它们,然后在需要更改状态时释放分配的内存。 我有一个对应于每个状态的函数,该函数返回void *。 这将代表在每种状态下相关的对象的地址。

所以一般的想法是

void* vPtr;
if (state == foo) { vPtr = foo(); }
else if (state == bar) { vPtr = bar(); }

//then, using the knowledge that all the object(s)
//are located at vPtr, do things with those objects

简而言之,这就是foo的样子

void* foo()
{
    //if first time executing foo, create some new object(s) and return a pointer 
    //to them
    if (firstEntry)
    {
        firstEntry = false; 
        Thing *thingPtr = new Thing; //create new Thing
        return (void*)thingPtr;      //return pointer to objects so they
                                     //can be used elsewhere in the application
    }

    else 
    {
        //do some things
        //..

        if (timeToLeaveStateFoo)
        {
            //  how to free up memory at location "thingPtr" ??
            //  can't use delete(thingPtr)

            return bar();  //where bar is defined similarly     
        }

        else {return vPtr;}
    }
}

如果这不是一个具体的示例,我深表歉意,我试图将问题归结为相关的内容。 我想最重要的是,有一种方法可以释放“新”分配的内存,而无需显式引用“新”返回的指针。 我知道地址,这还不够吗?

调用delete时,您不会显式引用原始指针。 您只需传递new最初返回的值的副本。

由于您的程序始终仅处于两个状态中的一个,而两个状态都有一些大对象,因此您可以考虑使用匿名结构的联合,其中包含每个状态的必要对象并放置新的/删除的位置。 尽管如此,那可能是严重的过早优化。

我不明白为什么您不能使用简单的类层次结构和虚拟方法解决此问题:

class A {
  virtual void foo() = 0;
  virtual ~A();
};

class Foo : public A {
  virtual void doStuff() { /* do "foo" stuff here ... */ }
};

class Bar : public A {
  virtual void doStuff() { /* do "bar" stuff here ... */ }
};

A *a_factory(bool first_time) {
  if (first_time) { return new Foo(); }
  else { return new Bar(); }
}

void baz(A *&thing) {
  a->foo(); // do regular foo stuff ...

  if (some_test) {
    delete a;
    a = a_factory(false);
    // ...
  }
}

是什么阻止您按照这些思路来做事?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM