C++ 如何释放由“分配的内存”;新",;,但不显式引用相应的指针

C++ 如何释放由“分配的内存”;新",;,但不显式引用相应的指针,c++,pointers,C++,Pointers,我的应用程序有两种状态,比如foo和bar。有一些对象与每个状态关联,但由于它们相对于内存来说很大,我希望在进入状态时创建它们(使用new),然后在更改状态时释放分配的内存。我有一个对应于每个状态的函数,它返回一个void*。这将表示处于每个状态时相关对象的地址 所以总的想法是 void* vPtr; if (state == foo) { vPtr = foo(); } else if (state == bar) { vPtr = bar(); } //then, using the kn

我的应用程序有两种状态,比如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”返回的指针。我知道地址,这还不够吗?

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

是什么阻止了你按照这些思路进行设计?

我不明白,为什么你不能调用
delete
?我不知道你的意思是什么,
Thing*p=vPtr;删除p;vPtr=bar()如果您在汇编中编写分配和解除分配部分,您可能可以按要求执行。但是,由于您希望编译器为您处理内存,因此必须向编译器提供原始指针。您只需要具有正确地址的正确类型的指针值。C++并没有追踪你是如何做到这一点的。谢谢大家。如果我说得太含糊,我再次道歉。当Deduplicator的评论出现时,我开始编写一个更具上下文的长编辑。这是我需要的答案。唯一可能阻止我的是,我对C/C++知之甚少。我是一个比较新的人,但我的背景是嵌入式h/w。我习惯于在汇编中编写并跟踪寄存器和内存内容,所以我的第一反应是“嘿,我知道在废话地址中有数据,现在我已经完成了x,准备好了y,让我重新调整该内存的用途,以实现状态y”从长远来看(甚至可能在短期内)你会过得更好如果您使用C/C++更像它的设计使用方式。为自己省去许多不必要的痛苦,多学一点这种语言,而不是把它当作一个花哨的汇编程序来使用。螺丝刀可以制造糟糕的锤子,反之亦然……不必担心,如果我真的忽略了你所面临的核心问题,我很抱歉。如果您还不习惯malloc/free,那么new/delete可能有点麻烦。C++实际上是关于自动安装/拆卸代码的对象寿命的语义。一个完全不同的世界。