C++:关于内存管理,指针本身是如何处理的?

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

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

谁能给我更多的见解?一直以来,我都觉得自己的内存出了问题。

在这种情况下,列表是我的“包”,它是数组实现的对象包装器。但是,由于它包含索引之间的空隙,我使用 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;

}

最佳答案

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

异常(exception)情况是,如果您正在执行类似 int** p = new int*[1] 的操作,即使用 new 创建指针。然后你会在某个时候需要delete p

如果你正在创建像 int* p = new int[size]; 这样的指针(这可能是你想要的),那么 p 本身就在stack,这意味着你不需要关心内存释放,但是 p 指向的数组在 heap 上,这意味着你将需要在某个时候取消分配它。

关于C++:关于内存管理,指针本身是如何处理的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527038/

相关文章:

c++ - 在 C++ 中将数据加载到内存中

c++ - header 中结构数组的链接器错误

c++ - 指针不修改地址?

c - 修改作为 C 函数参数传递的字符串

c++ - 如何在cout中添加变量?

c++ - 检查当前文件是否为 doc、docx、xls、xlsx 或 pdf 格式

c# - "readonly"(C#) 会减少内存使用吗?

android - 如何在 Android Studio 3.0 中查看 native 内存和图形内存的分配

qt - 制作轻量级网络浏览器 - Gecko vs Webkit vs ???; Qt4 vs Qt5 vs?

c++ - 在 void * 和指向成员函数的指针之间进行转换