【发布时间】:2015-04-14 17:54:06
【问题描述】:
在这段代码中,我尝试创建一个模板 classP_array,它存储指向对象的指针,如下所示。只需模板类存储指针,如果在使用后未删除,则将其删除。所以我应该做一个NULL 检查。
尽管此问题已在其他问题中得到解决。我不太明白如何检查指针是否为 NULL。
在析构函数~P_array()中检查NULL指针无效。
我用std::shared_ptr 尝试了类似的方法来解释这个想法。
p_array 析构函数:
~P_array() {
unsigned int i = 0;
while(i < total)
{
if (t_array[i]) //Not effective
{
std::cout << "deleting " << t_array[i] << "\n" ;
delete (t_array[i]); //Ownership of pointer
}
i++;
}
}
main.cpp:
#include <iostream>
#include <memory>
#include "p_array.h"
class Obj {
public: ~Obj () { std::cout << "Deleting Obj...\n" ;}
};
int main() {
P_array<Obj> ap;
Obj * op[10];
for (int i = 0; i < 10 ; i++)
{
op[i] = new (Obj);
ap.add(op[i]);
}
std::shared_ptr <Obj> sp = std::make_shared<Obj>();
//if (sp.get()) delete sp.get() ; // invalid pointer error
sp.reset();
//delete op[0] ;// gives double free error
}
所以我的问题很简单:
如果我删除存储在容器中的指针,该容器会删除析构函数中的指针,那么容器如何知道这些指针是否实际被删除?
删除指针是否会使其成为
NULL指针?如果容器无法检查已删除的指针,那么它如何获得这些指针的所有权,例如
P_array示例的情况?
【问题讨论】:
-
删除指针不会使其为空。如果需要,您必须将其显式设置为 null(删除后)。如果你有一个完整的(更小更简单)MVCE,这会更容易。
-
@Cornstalks 感谢您提供信息,但删除“垃圾数据”或其他内容后的指针值应该是什么。是否可以检查已删除的指针
-
见Barry's answer。指针值不受删除影响。指针指向的内存是无效的,但不能保证“无效”的含义:一些系统会用一些无效值(即
0xdeadbeef或零或类似的东西)擦除内存区域。一些系统将保持内存不变。它是实现定义的。