Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在没有访问权限的情况下删除对象?_C++_Object_Visual C++_Memory Management - Fatal编程技术网

C++ 如何在没有访问权限的情况下删除对象?

C++ 如何在没有访问权限的情况下删除对象?,c++,object,visual-c++,memory-management,C++,Object,Visual C++,Memory Management,我知道,每当我为一个类创建一个新对象时,该对象都存储在内存中。我还知道,在创建该对象时,只能在创建该对象的大括号集(范围可见性)内访问该对象。我需要找到一种方法来删除创建它的大括号之外的对象。我简单地看了一下智能指针,它可能就是我想要使用的?我想是的,我只是不确定。如果智能指针可以满足我的需要,请有人给我举一个例子,说明如何使用智能指针访问创建位置以外的对象?谢谢:) 编辑: 我正在尝试做的示例: class ModernWarfare2 { //my class ModernW

我知道,每当我为一个类创建一个新对象时,该对象都存储在内存中。我还知道,在创建该对象时,只能在创建该对象的大括号集(范围可见性)内访问该对象。我需要找到一种方法来删除创建它的大括号之外的对象。我简单地看了一下智能指针,它可能就是我想要使用的?我想是的,我只是不确定。如果智能指针可以满足我的需要,请有人给我举一个例子,说明如何使用智能指针访问创建位置以外的对象?谢谢:)

编辑:

我正在尝试做的示例:

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;
}
这样的物体,是的,超出了范围

动态分配的对象不会:

这是一个内存泄漏,因为您从未销毁过
*obj
;但是,您几乎可以在任何您喜欢的地方访问它:

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

void bar()
{
   T* obj = foo();
   // yay!
}
或:

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

这就是智能指针的用武之地,但是如果你想要一个关于使用智能指针的教程,我会让你回到你的C++11书籍


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

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

void foo()
{
    T obj;
}
这样的物体,是的,超出了范围

动态分配的对象不会:

这是一个内存泄漏,因为您从未销毁过
*obj
;但是,您几乎可以在任何您喜欢的地方访问它:

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

void bar()
{
   T* obj = foo();
   // yay!
}
或:

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

这就是智能指针的用武之地,但是如果你想要一个关于使用智能指针的教程,我必须让你回到你的C++11书籍中。

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

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

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

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

查看有关指针的更多信息。 我个人还没有发现智能指针的用途,但MSDN在主题方面有很好的信息

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

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

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

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

查看有关指针的更多信息。
我个人还没有发现智能指针的用途,但是MSDN在这个主题上有很好的信息

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

我建议你换衣服

if(!MW2Allocated)

这样您就不必创建另一个变量来保存对已分配内存的引用 当然你得走了

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

还要确保你使用

delete
而不是

delete[]
因为这不是数组分配

我不认为可以使用智能指针跳过保存对已分配内存的引用, 因为它们是为了使内存自动删除或确保不会发生两次删除 为了同样的记忆。 提到
要根据您的代码片段很好地解释智能指针,您必须将指针MW2保存为 以便您可以删除指针

我建议你换衣服

if(!MW2Allocated)

这样您就不必创建另一个变量来保存对已分配内存的引用 当然你得走了

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

还要确保你使用

delete
而不是

delete[]
因为这不是数组分配

我不认为可以使用智能指针跳过保存对已分配内存的引用, 因为它们是为了使内存自动删除或确保不会发生两次删除 为了同样的记忆。 提到 有关智能指针的详细说明,请使用

{
    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);
}
通过使用

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

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

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();
    }
}
“我也知道