c ++中的简单问题,说我有一个循环,我有返回指向项目的指针的函数 所以我必须定义内部循环指针所以我的问题是如何处理循环内的指针,删除它?或者设置新值是好的 例如:
for(int i =0;i<count();i++)
{
ptrTmp* ptr = getItemPtr();
// do somthing with the ptr ...
// what to do here ? to delete the poinetr or not?
delete ptr; // ??
}
答案 0 :(得分:11)
完全取决于接口getItemPtr
指定的内容。通常,返回原始指针的“get pointer”接口不会转移指向对象的所有权,因此删除它是错误的。在这种情况下,您可以安全地让指针变量超出范围。无需将其设置为NULL
。
另一方面,getItemPtr
可能被记录为返回指向必须删除的新对象的指针,在这种情况下,您需要删除它,但确保发生这种情况的更好方法是使用智能指针,以确保这种情况发生。在您的示例中,初始化std::auto_ptr
将是最简单,最便携的方法。
std::auto_ptr<ptrTmp> ptr( getItemPtr() );
答案 1 :(得分:4)
取决于getItemPtr()
的作用。
说文件是什么?
如果它说调用者负责对象破坏(通常是这种情况),那么必须在指针超出范围之前(或在其值丢失之前)删除它
通常,当一个函数返回一个指针并说你负责删除它时,会有一个相反的函数(比如deletePointer(PointedType* pointer)
),其作用是删除已分配的内存。因为,除非另有说明,否则您不能假定使用new
分配了指向的值,因此无法确定您是否必须致电delete
,delete[]
或free()
您也可以在删除后将指针设置为NULL
,以避免将来重用;这是一个很好的做法。
答案 2 :(得分:1)
写delete ptr;
,实际上会破坏指针。如果您不想销毁它,只需将指针移出范围。
将指针设置为新值将不会影响指针。