如何在无权访问的情况下删除对象

How to delete an object without having access to it?

本文关键字:情况下 删除 对象 访问      更新时间:2023-10-16

我知道每当我为类创建一个新对象时,该对象都会存储在内存中。 我还知道,在创建该对象时,只能在创建它的大括号集内访问它(范围可见性(。我需要找到一种方法来删除创建它的大括号之外的该对象。我已经简要地查看了智能指针,这可能是我想要使用的? 我假设是,我只是不确定。 如果智能指针可以满足我的需求,有人能为我提供一个如何使用智能指针访问创建对象之外的对象的示例吗? 谢谢:)

编辑:

我正在尝试做的事情的示例:

class ModernWarfare2
{
    //my class
    ModernWarfare2();
};

DWORD XamHook(DWORD r3, DWORD r4, DWORD r5)
{
    switch(XamGetCurrentTitleId())//a function that tells what game is being played
    {
    case Xbox360Dashboard://if i were to exit the game mw2
        {
            if(CODAllocated)//a boolean
            {
                //free the memory of the previous cod game
                if(MW2Allocated)//another boolean
                {
                    delete[] MW2;//gives me an error because i dont have access to MW2
                }
            }
            break;
        }
    case COD_MW2:
        {
            if(!CODAllocated)
            {
                if(!MW2Allocated)
                {
                    ModernWarfare2 *MW2 = new ModernWarfare2();
                }
            }
            break;
        }
    }
    return XamInputGetState(r3,r4,r5);
}

如何解决我的问题?

我还知道,在创建该对象时,只能在创建该对象的大括号集中访问该对象。

不一定;只有当你构造具有自动存储持续时间的对象时,才如此,如下所示:

void foo()
{
    T obj;
}

这样的对象,是的,超出了范围。

动态分配的对象不会

void foo()
{
    T* obj = new T();
}

这是一个内存泄漏,因为你永远不会破坏*obj;但是,你几乎可以从任何你喜欢的地方访问它:

T* foo()
{
   return new T();
}
void bar()
{
   T* obj = foo();
   // yay!
}

或:

T* obj = nullptr;
void foo()
{
   obj = new T();
}
void bar()
{
   // do stuff with *obj
}
void baz()
{
   foo();
   bar();
}

这一切都变得危险和混乱,因为你最终得到的意大利面条代码,其中动态分配对象的生存期不清楚,在上面的例子中,我仍然没有接近最终销毁对象的主题。你必须非常小心,不要在你还在使用它的时候破坏它。

这就是智能指针

的用武之地,但如果你想要一个关于使用智能指针的教程,我将不得不把你引回到你的C++11书。

"我还知道,在创建该对象时,只能在创建对象的大括号集中访问该对象。 - 这取决于您创建对象的方式。

示例 1(无法在大括号外访问(:

void func(void)
{
    Object obj("foo", "bar");
}

示例 2(可在大括号外访问(:

Object* func(void)
{
    Object* obj = new Object("foo", "bar");
    return obj;
}

可以使用关键字删除示例 2。

有关指针的更多信息,请查看此处。我个人还没有发现智能指针的用途,但 MSDN 在这里有关于该主题的良好信息

通过创建 MW2

{
    ModernWarfare2 *MW2 = new ModernWarfare2();
}

我无法在其他地方引用MW2。 通过这样做,我可以在两个不同的位置创建和删除它:

class ModernWarfare2
{
    //my class
    ModernWarfare2();
};
ModernWarfare2 *MW2 = NULL;
DWORD XamHook(DWORD r3, DWORD r4, DWORD r5)
{
    switch(XamGetCurrentTitleId())//a function that tells what game is being played
    {
    case Xbox360Dashboard://if i were to exit the game mw2
        {
            if(CODAllocated)//a boolean
            {
                //free the memory of the previous cod game
                if(MW2Allocated)//another boolean
                {
                    delete MW2;//gives me an error because i dont have access to MW2
                }
            }
            break;
        }
    case COD_MW2:
        {
            if(!CODAllocated)
            {
                if(!MW2Allocated)
                {
                    if(MW2 == NULL)
                    {
                        MW2 = new ModernWarfare2();
                    }
                }
            }
            break;
        }
    }
    return XamInputGetState(r3,r4,r5);
}

我认为你需要的是基本的设计模式
使数据和函数成为类的成员

class SomeHandler
{
public:
    void Acquire( /* some source */ );
    void DoSomething( /* eventual parameters */ );
    bool TrySomething(); // returns true if successful
private:
    void internalFunction();
    bool inGoodState;
    SomeType dataINeed;
    SomeOtherType otherData;
};
void SomeHandler::Acquire( /**/ ) 
{
    // implement like this
}

现在函数可以访问所有数据

像这样使用它

int main()
{
    SomeHandler h;
    h.Acquire();
    if( h.TrySomething() )
    {
        h.DoSomething();
    }
}

根据您的代码片段,您必须将指针 MW2 保存为将来,以便您可以删除指针。

我建议你改变

if(!MW2Allocated)

if(!MW2)

这样您就不必创建另一个变量来保存对分配内存的引用当然你必须移动

ModernWarfare2 *MW2

到更大的范围(将其移动到与 MW2Assigned 相同的范围(并将其初始化为 NULL。如果您使用的是 C++11 支持的编译器,请使用"nullptr"而不是"NULL"。

还要确保你使用

delete

而不是

delete[]

因为这不是数组分配

我认为您不能使用智能指针来跳过保存对已分配内存的引用,因为它们旨在使内存自动删除或确保不会发生两次删除对于相同的内存。指http://www.codeproject.com/Articles/541067/Cplusplus-Smart-Pointers有关智能指针的良好解释