【问题标题】:C++: How are pointers themselves handled regarding memory management?C++:关于内存管理,指针本身是如何处理的?
【发布时间】:2023-03-19 04:10:01
【问题描述】:

我有一个相当简单的问题; 我有包含指向对象的指针的数组。我有时会从这些数组创建变异数组,并且只在一个方法中使用它们。后来我就不需要了。在这种情况下,我不希望在继续使用原始数组时破坏指向的数据。我不完全理解的是在我的临时数组中创建的指针(不是数据本身,而是指针)会发生什么?内存如何处理它们。据我所知,指针只能指向一个地址。你不能“删除”它们。

谁能给我更多的见解?一直以来,我都觉得自己的记忆力有问题。

在这种情况下,列表是我的“包”,它是数组实现的对象包装器。然而,由于它包含索引之间的间隙,我使用 getGapless 来获取一个不包含 nullptr 索引的包。

我最后删除了我的包,但它并没有删除实际的内容(这是用不同的方法完成的)。

那么我的“玩家”包中的那些指针什么时候会超出范围?

virtual void processEntities(artemis::ImmutableBag<artemis::Entity*>& bag)
{
    artemis::Bag<artemis::Entity*> * list  = (artemis::Bag<artemis::Entity*>*)this->world->getGroupManager()->getEntities("HUMAN");
    if(list == nullptr) return;//Kill function

    artemis::Bag<artemis::Entity*> * players = list->getGapless();

    for(int i=0; i<players->getCount(); i++)
    {
        for(int j=i+1; j < players->getCount(); j++)
        {
            if(intersects(*players->get(i),*players->get(j))){
                std::cout << "Collide YEAH \n";
            }
        }
    }
    delete players;

}

【问题讨论】:

    标签: c++ memory pointers memory-management memory-leaks


    【解决方案1】:

    不,别担心!您可以将指针视为以与ints 或doubles 相同的方式进行管理(至少在内存方面)。指针本身就像一个int,恰好包含一些其他对象或对象数组的地址。一旦指针从作用域中消失,指针本身的内存将自动恢复。

    如果您正在执行类似int** p = new int*[1] 的操作,即使用new 创建指针,则例外。然后你会在某个时候需要delete p

    如果您正在创建像 int* p = new int[size]; 这样的指针(这可能是您想要的),那么 p 本身就在 堆栈 上,这意味着您不需要关心自己使用内存释放,但 p 指向的数组位于 上,这意味着您需要在某个时候释放它。

    【讨论】:

    • 我知道最终删除数据本身是必须的,但就我而言,我真的不知道它何时会超出范围。我已经用代码更新了我的问题。那么这段代码应该问题不大吧?
    • 是的,如果您将对象存储在某处(例如在std::map 中),那么您可以从实际对象(或在这种情况下对对象的引用)检索相同的指针信息。请记住,如果您无法引用在堆上创建的对象,则会发生内存泄漏,因此请在指针超出范围之前存储或删除。
    • 酷,谢谢。对于像我这样的新手来说,这真的很令人困惑。非常感谢=D
    • 这取决于getEntitiesgetGapless的实现。如果他们使用new 来分配他们的返回值,那么您需要delete 返回的对象。如果它们只是返回指向在其他地方创建的对象的指针,那么您可以将其视为仅返回 ints。 IE。完成后无需delete他们。
    【解决方案2】:

    指针是普通变量。它们没有以任何特殊方式处理。指针变量和整数变量在这方面没有区别,因为指针数组和整数数组在这方面没有区别。

    语言中所有变量的内存管理完全取决于您。如果你声明一个局部变量,当控制离开它的块时它会被自动销毁。如果您动态分配/创建对象,那么您必须显式地取消分配/销毁它们。等等。指针绝对没有什么特别之处。它们就像任何其他变量一样。

    基本上,不清楚您为什么要问这个问题,因为您的问题似乎要解决的问题实际上并不存在。您能否举例说明是什么原因导致您提出这个问题?

    【讨论】:

      【解决方案3】:

      指针只保存地址,'int' 保存整数的方式相同。如果您有一个 int 数组,并且您使用基于它的变异数组,然后摆脱变异数组,则原始数组保持不变;这里真的没有什么不同。

      变异数组中的值消失了,但由于它们是副本(无论它们是整数还是指针或其他),它不会影响原始数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2012-01-24
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        相关资源
        最近更新 更多