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

时间:2012-07-17 16:40:33

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

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

任何可以给我更多见解的人?这段时间我觉得我在做记忆错了。

在这种情况下,list是我的“bag”,它是数组实现的对象包装器。但是因为它包含索引之间的gabs,所以我使用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;

}

3 个答案:

答案 0 :(得分:5)

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

如果您正在执行类似int** p = new int*[1]的操作,例如使用new创建指针,则会出现例外情况。那么您在某些时候需要delete p

如果你正在创建像int* p = new int[size];这样的指针(这可能是你想要的),那么p本身就在堆栈上,这意味着你没有需要关注内存释放,但数组p指向,这意味着您需要在某个时候解除分配。

答案 1 :(得分:1)

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

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

基本上,不清楚为什么你甚至会问这个问题,因为你的问题似乎解决的问题并不存在。你能提供一个例子来说明你的问题吗?

答案 2 :(得分:0)

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

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