如何在无权访问的情况下删除对象
How to delete an object without having access to it?
我知道每当我为类创建一个新对象时,该对象都会存储在内存中。 我还知道,在创建该对象时,只能在创建它的大括号集内访问它(范围可见性(。我需要找到一种方法来删除创建它的大括号之外的该对象。我已经简要地查看了智能指针,这可能是我想要使用的? 我假设是,我只是不确定。 如果智能指针可以满足我的需求,有人能为我提供一个如何使用智能指针访问创建对象之外的对象的示例吗? 谢谢:)
编辑:
我正在尝试做的事情的示例:
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有关智能指针的良好解释
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- 在不使用任何 STL 容器的情况下删除重复项
- 如何在不泄漏内存的情况下删除链接列表
- 使用QT,如何在不读取整个文件的情况下删除文本文件中的第一行
- C++ 如何在不丢失内存的情况下删除节点
- 如何在没有递归的情况下删除链接列表
- 在只给定单个链接列表中间的节点的情况下删除该节点.C++
- 在不使用虚拟析构函数的情况下删除继承的对象时中止
- 检查目录树是否可以在不实际开始删除的情况下删除
- 如何在不知道其类型的情况下删除结构
- C++ 在不知道位置的情况下删除矢量中的特定值
- 如何在不导入任何库的情况下删除矢量
- 重写类运算符new并在不更改类的情况下删除
- 如何在无权访问的情况下删除对象
- 我将如何在不损坏列表的情况下删除链表中的节点
- Qmake:如何在不更改Qmake .conf的情况下删除某个项目的编译器标志
- 我可以在不检查是否存储该对象的情况下删除联合组件吗?
- 内存管理 - 是否可以在不调用析构函数的情况下删除 c++ 中的对象
- 我可以在不中断代码的情况下删除此警告吗?