如何释放" new"分配的内存,但没有明确引用相应的指针

时间:2014-04-14 00:22:51

标签: c++ pointers

我的应用程序有两种状态,比如说foo和bar。有一些对象与每个状态相关联,但由于它们在内存方面很大,我想在进入状态时创建它们(使用new)然后释放分配时的内存。改变国家。我有一个对应于每个状态的函数,它返回一个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;}
    }
}

如果这不是一个具体的例子,我很抱歉,我试图将问题归结为相关的比特。我想底线是是否有办法释放" new"没有明确引用" new"返回的指针。我知道地址,不应该足够吗?

2 个答案:

答案 0 :(得分:1)

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

因为你的程序总是只处于两种状态中的一种状态,它们都有一些巨大的对象,所以你可以考虑使用包含每个状态的必要对象和放置new / delete的匿名结构的联合。不过,这可能是过早优化的严重情况。

答案 1 :(得分:0)

我不明白为什么你用一个简单的类层次结构和虚拟方法来解决这个问题:

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);
    // ...
  }
}

什么阻止你的设计从事这些方面的工作?