使用指针的c++
C++ working with pointers
我不明白为什么它输出"123",即使deletenode函数设置x为NULL。
#include <iostream>;
using namespace std;
struct node {int value; struct node *left,*right,*parent;};
void deletenode(node *a) {
delete a;
a=NULL;
}
int main(int argc, const char * argv[])
{
node *x = new node;
x->value=123;
deletenode(x);
if (x!=NULL) cout << x->value;
}
您有以下签名:void deletenode(node *a)
。将指针x
传递给函数。指针值被复制。在函数内部,您可以通过a = NULL
写入本地指针值来修改它。
然而,修改发生在副本上。原来的不受影响。注意,delete
不是这样,因为delete
不修改指针,它修改(或者更确切地说,清除)指针。
表面的解决方案是通过引用传递指针值:
void deletenode(node*& a)
然而,有一个共识,即在删除后设置指向nullptr
(或NULL
)的指针并没有真正帮助,因此通常不这样做。因此,我将用一个简单的delete x;
语句替换您对deletenode
的整个调用。
虽然您已经成功地删除了您想要删除的对象,但是指针本身是通过value(复制到变量'a')传递给deletenode()的。因此,即使函数中的变量'a'为null,变量'x'仍然指向现已删除的内存。
因为使用delete实际上是将内存标记为空闲并准备重用,但是该区域的内容可能保持不变
你将这个指针通过VALUE传递给函数——这意味着你不会看到函数外部的变化。
#include <iostream>
template<typename T>
void destroy(T*& ptr) {
delete ptr;
ptr = NULL;
}
template<typename T>
struct node {
node(T t) : value(t) { }
~node() {
delete left;
delete right;
}
T value;
struct node *left,*right,*parent;
};
int main(int argc, const char * argv[]) {
node<int> *x = new node<int>(123);
destroy(x);
if (x != NULL) {
std::cout << x->value << 'n';
}
}
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错