如果指针已被删除,指针容器如何才能拥有指针的所有权?

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)

所以我的问题就是:

  1. 如果我删除存储在容器中的指针,该容器删除析构函数中的指针,那么容器如何知道这些指针是否实际被删除?

  2. 删除指针会使它成为NULL指针吗?

  3. 如果容器无法检查已删除的指针,那么它如何获得这些指针的所有权,例如在P_array示例的情况下?

Mik*_*our 5

如果我删除一个存储在容器中的指针,该容器删除了析构函数中的指针,那么容器如何知道这些指针是否被精确删除?

它没有.指针没有超出其指向的对象地址的信息.如果您需要额外的信息来确定该对象是否是动态分配的,或者是否已被删除,您需要将其保留在其他位置,例如智能指针.

删除指针会使它成为NULL指针吗?

没有.

如果容器无法检查已删除的指针,那么在P_array示例的情况下它如何获得这些指针的所有权

使用类似std::unique_ptr或的智能指针std::shared_ptr,具体取决于它是否应具有独占或共享所有权.