如何删除对象而无法访问它?

use*_*925 1 c++ memory-management object visual-c++

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

编辑:

我正在尝试做的例子:

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);
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决我的问题?

Lig*_*ica 5

我也知道在创建该对象时,只能在创建它的大括号内访问该对象.

不必要; 只有在构造具有自动存储持续时间的对象时才会出现这种情况,如下所示:

void foo()
{
    T obj;
}
Run Code Online (Sandbox Code Playgroud)

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

动态分配的对象不会:

void foo()
{
    T* obj = new T();
}
Run Code Online (Sandbox Code Playgroud)

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

T* foo()
{
   return new T();
}

void bar()
{
   T* obj = foo();
   // yay!
}
Run Code Online (Sandbox Code Playgroud)

要么:

T* obj = nullptr;

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

void bar()
{
   // do stuff with *obj
}

void baz()
{
   foo();
   bar();
}
Run Code Online (Sandbox Code Playgroud)

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

这是智能指针的用武之地,但是如果你想要一个关于使用智能指针的教程,我将不得不再将你推荐给你的C++ 11书.