我怎么能理解,如果一个指针被删除在c++
How can I understand if a pointer is deleted in C++
当我编写这样的代码时,它打印"not deleted"。如何100%确定指针是否被删除?
int* a = new int;
*a = 5;
delete a;
if (!a) //I also tried a == NULL but got same result
cout<<"deleted"<<endl;
else
cout<<"not deleted"<<endl;
你不能。确保在delete
指针时删除指针的所有副本,因为指针引用的内存位置可能会在以后的不同数据中被重用。
在指针上调用delete并不会将指针本身设置为NULL(为什么要这样呢?您将意识到,给定delete
的签名(即,它需要void*
而不是void**
),它不可能这样做。
你认为你为什么需要这个?您不需要检测这种情况,只需构建代码,使内存被确定性地释放。
你不是在"删除"指针,而是在删除指针所指向的内容。
像这样安排你的代码:
{
int* a = new int;
*a = 5;
delete a;
}
// a no longer exists so you know it is gone.
p。最好不要使用RAW指针。
{
// C++03
std::auto_ptr<int> a(new int);
*a = 5;
}
或
{
// C++11
std::unique_ptr<int> a(new int);
*a = 5;
}
删除指针不会将其设置为NULL,它会删除指针所指向的内存。即使你要检查内存,你也无法确定它是否空闲。换句话说,检查指针是否指向"可用"内存并不简单,当然不像a == NULL
那么简单。
这就是为什么当你释放指向的内存时,将指针设置为NULL被认为是一个很好的做法::
int* a = new int;
*a = 5;
delete a;
a = NULL;
if (!a) //I also tried a == NULL but got same result
cout<<"deleted"<<endl;
else
cout<<"not deleted"<<endl;
为什么不使用valgrind实验"证明"应用程序没有内存泄漏——证明所有节点都被删除了,它们的内容也被删除了?
Valgrind在虚拟机中运行应用程序,并跟踪堆上的所有分配和取消分配。它可以报告任何无效的内存访问,并可以配置为报告有多少内存泄漏(手动分配的内存没有被释放)。
一个简单的事实是:c++不是一种安全的语言。
这很好。如果你正在使用c++,你想要控制何时安全,如何安全,以及哪里不安全。
当您手动删除指针时,绝对没有任何指针已被删除的指示。这就是为什么大多数现代c++文本会告诉你,除非你有特殊的理由,否则不要使用裸指针。你根本不应该手动删除指针,除非你有特殊的理由这样做。
如果你正在创建一个数据结构,那么你希望这个数据结构有多安全取决于你自己。注意,c++标准库数据结构允许迭代器(广义指针)在某些条件下失效。这使得用户知道他们在做什么。
这样做的好处是快速的性能。如果您不想要这种性能,那么您需要使用更安全的容器或数据结构。如果需要这种安全性,那么应该对数据结构中的元素使用智能指针。用户应该获得引用节点而不是裸指针的shared_ptr<>
或weak_ptr<>
对象。等等
c++不安全。当然,这并不安全;这是c++。但是很好
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 引用一个已擦除类型(void*)的指针
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 不明白迭代器,引用和指针失效,一个例子
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 将指针分配给另一个指针时会发生什么情况?
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++将一个指针分配给另一个指针时执行的类型检查
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 取消引用结束指针到数组类型的一个
- 更改一个指针后更改乘法对象
- const和指针(一个节点示例)
- 从函数返回指针.一个指针的值未更新