Mr.*_*r.Y 2 c++ pointers c++11
在这段代码中,我尝试创建一个模板类P_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++;
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题就是:
如果我删除存储在容器中的指针,该容器删除析构函数中的指针,那么容器如何知道这些指针是否实际被删除?
删除指针会使它成为NULL指针吗?
如果容器无法检查已删除的指针,那么它如何获得这些指针的所有权,例如在P_array示例的情况下?
如果我删除一个存储在容器中的指针,该容器删除了析构函数中的指针,那么容器如何知道这些指针是否被精确删除?
它没有.指针没有超出其指向的对象地址的信息.如果您需要额外的信息来确定该对象是否是动态分配的,或者是否已被删除,您需要将其保留在其他位置,例如智能指针.
删除指针会使它成为NULL指针吗?
没有.
如果容器无法检查已删除的指针,那么在P_array示例的情况下它如何获得这些指针的所有权
使用类似std::unique_ptr或的智能指针std::shared_ptr,具体取决于它是否应具有独占或共享所有权.