C++ 删除或为指针赋值零

C++ 删除或为指针赋值零,c++,pointers,new-operator,delete-operator,C++,Pointers,New Operator,Delete Operator,在代码中的哪些情况下,我们应该删除给定的指针,我们最好在哪里为其指定零,而不是删除 在代码中的什么情况下,我们应该删除给定的指针并 我们最好在哪里给它赋值零,而不是删除 如果使用new创建指针,则删除该指针。实际上,您正在删除指针指向的对象,而不是指针本身。尽管语法确实允许您编写删除ptr。但删除的是ptr点的位置。非ptr 将nullptr分配给指针(如果您以前没有执行delete)没有帮助-您实际上会丢失指针指向的对象的地址,并造成内存泄漏(当然,如果没有其他指针指向原始对象)。e、 g.这

在代码中的哪些情况下,我们应该
删除
给定的
指针
,我们最好在哪里
为其指定零,而不是
删除

在代码中的什么情况下,我们应该删除给定的指针并 我们最好在哪里给它赋值零,而不是删除

如果使用
new
创建指针,则删除该指针。实际上,您正在删除指针指向的对象,而不是指针本身。尽管语法确实允许您编写
删除ptr
。但删除的是
ptr
点的位置。非
ptr

nullptr
分配给指针(如果您以前没有执行
delete
)没有帮助-您实际上会丢失指针指向的对象的地址,并造成内存泄漏(当然,如果没有其他指针指向原始对象)。e、 g.这很糟糕:

double* pvalue  =  new double;   
..
pvalue = nullptr; // Bad - pointer to original memory is lost now
delete pvalue; // What should I delete?
因此,如果使用
new
创建对象,则需要在将
nullptr
分配给指针之前
delete
对象

因此,在
删除后
可以将
nullptr
分配给指针



<>你说你需要在你的代码中真的需要动态内存分配(例如<代码>新< /代码>)。

< P>我认为,在使用了<代码>新< /代码>之后,我们不再需要一个指针,当它所引用的对象不再需要时。在指针被删除后,可以将其赋值为零(最好是
NULL
),以表明指针不再指向某个对象。然后可以测试指针是否等于
NULL

在代码中的什么情况下,我们应该删除给定的指针并 我们最好在哪里给它赋值零,而不是删除

你永远不会只是给指针赋零,而不是删除它。规则是,如果您使用new来分配内存,那么您应该始终使用delete来取消分配内存

有时,根据您的需求,删除指针后可能需要将其设为空

空值无关紧要的示例:

class MyClass
{
public:
    MyClass()
        : data_(new int(1024))
    {}

    ~MyClass()
    {
        delete data_;
        // we don't need to null data_ here because we can be sure that it is not used after MyClass is destructed.
    }
private:
    int* data_;
};
删除后应将指针设为空的示例:

class MyClass
{
public:
    MyClass()
        : data_(nullptr)
    {}

    ~MyClass()
    {
        delete data_;
    }

    void CreateData()
    {
        if(data_ == nullptr)
        {
            data_ = new int(10);
        }
    }

    void DeleteData()
    {
        delete data_;
        // we must make sure to null data_ here otherwise we will have issues calling CreateData again.
        data_ = nullptr;
    }

private:
    int* data_;
};
注意
上述示例仅用于演示上述要点,因为它们不符合。

delete p
删除
p
所指向的对象(严格来说不是指针)。如果将零指定给指针,则指针指向的对象不受影响!。。。因此:当您必须删除时,您可以删除,如果指针的值不再是有效地址,您可以指定一个零。有什么原因不能使用
Foo f
自动f=std::使_唯一()?(在这两种情况下,你都不必担心做一个
删除
)@tobi303:显然,一切都在改变。通过
delete
我们更改指针的值(地址)和对象的值(通常是一个大的负数)@迈克尔:我还没学过你提到的话题。谢谢你们两位。我一点也不明白你们说的“通常是一个很大的负数”是什么意思。一旦删除对象,它就不再有值。一旦删除它,尝试访问它的值是未定义的行为。如果这是指向该对象的最后一个指针,则这只是内存泄漏。在现代代码中,应该使用“nullptr”而不是“NULL”。礼貌地说,我建议不要编辑您的帖子,建议使用“NULL(或
nullptr
)”,后者放在括号中。只需推荐
nullptr
NULL
是C语言的遗物,它的意思是0(有所有的限制),在现代风格中没有一席之地。编辑:啊,完成了:)谢谢大家,特别感谢乔治的回答,也为我澄清了内存泄漏的概念。关于
nullptr
,它的工作实际上就像是赋值零@乔治:在你的最后一句话中,我认为“将
nullptr
分配给它”部分应该改为“将
nullptr
分配给
指针
”:-)