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