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
分配给指针
”:-)