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

时间:2014-10-25 18:45:17

标签: c++ object visual-c++ memory-management

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

编辑:

我正在尝试做的例子:

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

如何解决我的问题?

5 个答案:

答案 0 :(得分:5)

  

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

不一定;只有在构造具有自动存储持续时间的对象时才会这样,例如:

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 :(得分:1)

"我也知道在创建该对象时,只能在创建它的大括号内访问该对象。" - 这取决于你如何创建对象。

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

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

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

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

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

有关指针的更多信息,请查看here。 我个人没有找到智能指针的用途,但MSDN有关于该主题的良好信息here

答案 2 :(得分:0)

通过

创建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);
}

答案 3 :(得分:0)

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

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();
    }
}

答案 4 :(得分:-1)

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

我建议你改变

if(!MW2Allocated)

if(!MW2)

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

ModernWarfare2 *MW2

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

还可以使用

delete

而不是

delete[]

因为这不是数组分配

我认为你不能使用智能指针来跳过保存对已分配内存的引用, 因为它们意味着自动删除内存或确保不会发生两次删除 为了相同的记忆。 参考 http://www.codeproject.com/Articles/541067/Cplusplus-Smart-Pointers 有关智能指针的详细解释