Ima*_*889 1 c++ heap pointers scope
我一直在阅读有关C++指针的各种问题和答案,但我仍然从根本上不理解某些东西.
我已经读过,指针允许动态内存分配,实际上没有删除对象,直到明确告知这样做.我理解这一点,但我不明白的是,在指针范围结束后,堆上的对象是如何被再次引用的.
见下面的代码.
{
myClass* x = new myClass();
}
// How to access the object that x points to here?
Run Code Online (Sandbox Code Playgroud)
我知道在范围的末尾,x
(指针本身)不再存在,但是对象(指针指向的对象)仍然存在于堆上.
我的问题是:如果指向内存中该地址的指针不再存在,那么内存中的地址如何再次被访问?
如果指向内存中该地址的指针不再存在,那么内存中的该地址是如何再次访问的?
如果指针值未存储在其他位置,则该对象将"泄露"并变得不可访问.对象将继续存在,直到进程终止,此时操作系统将回收对象使用的内存.
我不明白的是,在指针范围结束后,堆上的对象是如何被再次引用的.
指针必须在其他地方复制.例如,您可以在本地指针超出范围之前将指针放入向量或映射中,然后仍然可以通过存储在向量/映射中的指针访问该对象:
int main() {
std::vector<myClass *> objects;
{
myClass *x = new myClass();
objects.push_back(x);
}
// The heap-allocated object can be accessed through objects[0] now
objects[0]->doSomething();
// Don't forget to clean up (or use smart pointers)
for (auto i : objects) { delete i; }
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,在学习C++时学习如何使用原始指针很有用,但在某些时候你应该切换到智能指针std::unique_ptr
,这将自动delete
指向你的指向对象:
{
std::unique_ptr<myClass> x{new myClass()};
}
// The myClass object has already been deleted by the smart pointer
Run Code Online (Sandbox Code Playgroud)