C ++在指针范围结束后访问堆上的对象

时间:2017-09-14 17:59:48

标签: c++ pointers scope heap

我一直在阅读有关C ++指针的各种问题和答案,但我仍然从根本上不理解某些东西。

我已经读过指针允许动态内存分配,实际上没有删除对象,直到明确告知这样做。我理解这一点,但我不明白的是,在指针范围结束后,堆上的对象是如何被再次引用的。

见下面的代码。

{
   myClass* x = new myClass();
}
// How to access the object that x points to here?

我理解在范围的最后,x(指针本身)不再存在,但是对象(指针指向的对象)仍然存在于堆上。

我的问题是:如果指向内存中该地址的指针不再存在,那么内存中的地址如何再次被访问?

2 个答案:

答案 0 :(得分:7)

  

如果指向内存中该地址的指针不再存在,那么内存中的地址是如何再次访问的?

如果指针值未存储在其他位置,则该对象将“泄露”并变得无法访问。对象将继续存在,直到进程终止,此时操作系统将回收对象使用的内存。

  

我不明白的是,在指针范围结束后,堆上的对象是如何被再次引用的。

指针必须在其他地方复制。例如,您可以在本地指针超出范围之前将指针放入向量或映射中,然后仍然可以通过存储在向量/映射中的指针访问该对象:

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

请注意,在学习C ++时学习如何使用原始指针很有用,但在某些时候你应该切换到像std::unique_ptr这样的智能指针,它会自动delete指向你的对象:

{
    std::unique_ptr<myClass> x{new myClass()};
}
// The myClass object has already been deleted by the smart pointer

答案 1 :(得分:0)

在这里你可以找到一个小例子,它显示了(1)没有正确删除的分配,(2)正确删除的分配,以及(3)使用智能指针进行分配时的差异,当智能指针超出范围时自动删除。只需运行该程序即可看到第一个示例泄漏内存。

#include <iostream>
#include <memory>

class A
{
    public:
        A(std::string name) : name_(name) 
        {
            std::cout << "My name is " << name_ << ", and I make mess...\n";
        }
        ~A()
        {
            std::cout << "My name is " << name_ << ", and I clean up...\n";
        }
    private:
        std::string name_;
};

int main()
{
    // 1. Leaks.
    A* a0;
    a0 = new A("a0");

    // 2. Does not leak.
    A* a1;
    a1 = new A("a1");
    delete a1;

    // 3. Does not leak.
    std::unique_ptr<A> a2 = std::make_unique<A>("a2");

    return 0;
}