-
2017-09-20 09:17:48
1,智能指针
2,在使用时,进行地址判断是否指向同一地址。
更多相关内容 -
两个指针指向同一地址,释放其中一个指针。
2022-05-06 17:07:50今天遇到的问题是: 指针p1和指针p2指向同一块地址。 先释放了p1,后释放p2,出错。 错误原因: 释放指针指的是释放这块空间。 这块空间已经释放之后就可以被其他的使用。 而再次释放此指针会出错。 ...今天遇到的问题是:
指针p1和指针p2指向同一块地址。
先释放了p1,后释放p2,出错。
错误原因:
释放指针指的是释放这块空间。
这块空间已经释放之后就可以被其他的使用。
而再次释放此指针会出错。 -
c++ 指向同一地址的指针 和 指针的引用
2021-08-19 22:52:05总结:不要让两个指向同一地址的指针同时操作这个内存空间,会出错 例1 BstNode* p1=tree->GetRoot();//p1=null BstNode* p2 = p1;//p2和p1指向同一地址空间 null cout << p1->data;//地址为0153F308一 指向同一地址的指针
pointer *p1;
pointer *p2;
p2=p1;
⭐ p2=p1是让p2和指向同一内存空间,但如果后续p1地址变了,p2的地址不会随之改变。是浅拷贝
总结:不要让两个指向同一地址的指针同时操作这个内存空间,会出错例1 BstNode* p1=tree->GetRoot();//p1=null BstNode* p2 = p1;//p2和p1指向同一地址空间 null cout << p1->data;//地址为0153F308 p1= new BstNode(1);//为p1分配空间 cout << p1->data;//地址为01540DE8 cout << p2->data<<endl;//error 地址为0153F308 p2=null 例2 BstNode* p1=tree->GetRoot();//p1=null BstNode* p2 = p1;//p2和p1指向同一地址空间 null p1= new BstNode(1);//为p1分配空间 p2 = p1;//p1和p2指向同一地址空间 BstNode(1) delete p1; cout << p2->data<<endl;// p2->data=???? 但p2能访问 cout << p1->data;//error p1为空指针
二 指针的引用
pointer *p1;
pointer *p2;
p2=&p1;
p2和p1实际上相同,p2是p1的别名。是深拷贝例1 BstNode* p1=tree->GetRoot();//p1=null BstNode* &p2 = p1;//p2和p1指向同一地址空间 null p1= new BstNode(1);//为p1分配空间 cout << p1->data;//地址为00F70C700 cout << p2->data<<endl;//地址为00F70C700 例2 例2 BstNode* p1=tree->GetRoot();//p1=null BstNode* p2 = p1;//p2和p1指向同一地址空间 null p1= new BstNode(1);//为p1分配空间 p2 = p1;//p1和p2指向同一地址空间 BstNode(1) delete p1; cout << p2->data<<endl;// error p2为空指针 cout << p1->data;//error p1为空指针
三、应用
void BST_Insert(BstNode* &Node,BstNode* parent, int data)
①对传进来的参数Node进行分类- Node为nullptr 这时应该使用&符号,因为nullptr并不指向一确定空间,当修改函数内部的类时,外部的并不会修改。解决方法:return Node用于接受
- Node不为nullptr 随便都行
-
两个指针指向同一内存的问题
2017-08-16 02:25:08看数据结构看到循环链表的合并,很奇怪为什么最后要free掉p,这样rearB->next不就会随机指向其他的内存了吗 -
如何避免两个指向同一个地址的多次释放有关问题
2021-05-21 11:55:57怎么避免两个指向同一个地址的多次释放问题本帖最后由 wallwind 于 2014-03-05 20:44:48 编辑比如以下代码#include#includeintmain(){int*ptr=malloc(10*sizeof(int));int*ptr2=ptr;if(ptr){free(ptr);ptr=NULL;...怎么避免两个指向同一个地址的多次释放问题
本帖最后由 wallwind 于 2014-03-05 20:44:48 编辑
比如以下代码
#include
#include
int main()
{
int *ptr = malloc(10*sizeof(int));
int *ptr2 = ptr;
if(ptr)
{
free(ptr);
ptr =NULL;
printf("delete one");
}
if(ptr2)
{
free(ptr2);
ptr2=NULL;
printf("delete two");
}
return 0;
}
以上代码肯定有问题。。。这种怎么避免?
------解决方案--------------------
没有百分百避免这类问题的方法,越安全的东西自由度越小,绝对安全的东西根本不需要程序员
尽可能遵守谁申请谁释放的原则,或者使用智能指针不进行手动释放,可以在一定程度上减少这类问题出现的几率
------解决方案--------------------
静态分析工具splint对LZ程序(假设其文件名为two_pointers.c)报以下信息:
E:\two_pointers.c(16,6):
Variable ptr2 used after being released
E:\two_pointers.c(11,11): Storage ptr2 released
以上信息指出ptr2指向的存储在第11行被释放了,但第16行还在使用ptr2.
------解决方案--------------------
1 每次释放时判空,不成立则释放,释放后置空
2 智能指针
------解决方案--------------------
这样是没法避免的,只有从根本上避免同时指向同一处,如果指向了同一处那就只释放一个(总之就是只有靠自己了)
------解决方案--------------------
避免?为何要避免,你一个指针使用,一个指针分配释放就行了
如果所有的陷阱,或者所有会出错的地方,都非要避免不可。
那就不是C语言了
事情做正确,除了机制以外,还有协议,约定 可以用来避免出错。
如果非要避免。
那就用C++把指针封装死,不给用,不暴露HANDLE,那就不会出错了。
C 语言,就直接不允许,使用第二个指针就可以了。
比如 把需要分配内存的一系列算法,做成函数,只能这么用,其他一切都认为是错误的。
------解决方案--------------------
只有相信自己!
引用:比如以下代码
#include
#include
int main()
{
int *ptr = malloc(10*sizeof(int));
int *ptr2 = ptr;
if(ptr)
{
free(ptr);
ptr =NULL;
printf("delete one");
}
if(ptr2)
{
free(ptr2);
ptr2=NULL;
printf("delete two");
}
return 0;
}
以上代码肯定有问题。。。这种怎么避免?
------解决方案--------------------
这个真只有自己注意了 智能指针也是个好办法
------解决方案--------------------
引用:Quote: 引用:if(ptr)?既然是C不是C++,请用if(ptr == NULL)。
另外,多此一举。free掉一个空指针no-op。最多free完=NULL。
请教下为什么C的指针判空用NULL更好?
if转换成整数比较,用来判断非空指针在逻辑上就是错的。
C不保证空指针和整数0的存储一致表示,因此不保证if(ptr)的指针非空。尽管这样的实现并不常见,但的确存在。
对于C++,if(ptr)中ptr直接contextually convert to bool,使用标准转换boolean conversion,当且仅当空时false,因此这是安全且一般推荐的做法。== NULL在C++中是多余的。
------解决方案--------------------
type *p = malloc(...);
type *q = p;
free(p); p=NULL;
if(q!=NULL) {
free(q);
q = NULL;
}
这种方式根本就避免不了 double free!
------解决方案--------------------
一个地方申请,一个地方释放,这逻辑多简单啊,程序本身就该这样写,写程序-----智能的灵活的永远比不过简单的清析的!!!
想搞智能又灵活的都是最后自己给自己下套儿,而且引入一堆隐患和问题
------解决方案--------------------
引用:Quote: 引用:比如以下代码
#include
#include
int main()
{
int *ptr = malloc(10*sizeof(int));
int *ptr2 = ptr;
if(ptr)
{
free(ptr);
ptr =NULL;
printf("delete one");
}
if(ptr2)
{
free(ptr2);
ptr2=NULL;
printf("delete two");
}
return 0;
}
以上代码肯定有问题。。。这种怎么避免?
谁用谁释放,非要自己弄个1对多的平级关系,错了怪谁
这个回复我喜欢,比其它楼的回复都要好,其它人说的再多再精彩本质上都是一砣翔
------解决方案--------------------
1:你未必会遇到这种问题。
2:这种问题很容易被内存检查器发现。
3:你可以用引用计数来解决。
------解决方案--------------------
怎么避免两个不同用途的指针指向同一个地址导致释放这两个指针所指对象时发生多次释放问题?
------解决方案--------------------
引用:这就是为什么shared_ptr会有refcount这个概念。
支持
------解决方案--------------------
不是malloc的指针都可以直接指成NULL
只有做了malloc的指针必须执行free
------解决方案--------------------
-
C语言 指向同一数组的两个指针变量间的关系
2021-01-25 14:18:31指向同一数组的两个指针变量 相减 表示 相差元素个数,可以 比较 地址编号大小,两个指针变量不能相加 指针变量加一个数表示 跳过(指针变量类型的字节数)*(这个数)的字节数 数组名[ 不越界的情况下可以为复负数 ],... -
能否使用两个指针变量指向同一个地址,然后先free一个,再使另一个取下个地址,来进行链表的删除?
2019-12-13 10:52:21void DestoryList(ListNode *&L) { ListNode *s,*r; s = L->next; while (s != NULL) ...//不能用这种方法,因为free的机制是使得这部分...答案是不行的,因为free的机制是让该指针变量所指的地址可以随意被调... -
多个指针指向同一个地址
2017-11-19 20:02:30多个指针指向同一个地址,这样使用没什么问题,只是操作时要注意。 因为,每个指针变量保存的值,仅仅是指向的内容的地址值。多个指向同一个地址的指针,若其中一个指针等于NULL,不影响另一个指针。 代码 int* a... -
两个指针指向统一内存相关问题
2021-02-23 11:11:141:两个指针指向统一内存,一个指针进行++或者–操作,不会改变另一个指针的指向。 2:释放一个指针such as:free or delete。 另一个指针不会被释放,但不能再访问它指向的内存。 -
为什么C++中不同指针指向同一字符串,指针地址是相同的 ?
2016-09-24 21:01:235、6、7、8是字面值常量,存放在代码区,是不能修改的,“abc”本身就是一个地址,然后你在栈区定义了四个指针都是指向同一个地址, 指针比较的时候比较的是指针存放的地址,而不是指针本身的地址,当然5、6、... -
(堆)关于两个指针同时指向同一块内存空间的错误思维
2022-02-24 16:50:14现在有两个指针,他们分别指向“堆”上的不同的内存空间(不是栈); 假设有两个指针*p1,*p2; 现在想要将*p2的内容拷贝到*p1中; p1=p2 //如果是栈上可以直接赋值,因为内存泄漏跟野指针不用考虑 显然在栈上,... -
双指针指向同一内存的释放问题
2015-06-29 21:45:00resultImageToDisp,在主函数里面有个局部变量IplImage* resultImage,我需要将resultImageToDisp赋值给resultImage,但只是浅拷贝,就是说resultImageToDisp和resultImag两个图像指针指向了同一内存,主函数结束时按... -
不要为了方便,让两个指针指向同一块内存
2018-08-11 15:36:09现在在修改之前写的代码,发现其中一个问题,示例代码如下: //Video.h class Video { public: Video(int nr, int nc); ~Video(); public: int* GetVideoData(); private: int *m_pBuff; } //Video.cpp Video... -
C++ 多个指针指向同一个对象
2019-03-16 14:01:36多个指针指向同一个对象。当对象被删除时,如果有指针没有被赋值为null,将可能出现不可预期的后果。 -
两个指针指向问题
2021-03-04 10:51:15然后再定义一个指针,将开始的那个指针赋值给后面定义的这个指针(就是目前这两个指针都指向同一片空间的首地址),当重新给开始的那个指针划分空间时,后面定义的那个指针指向不变,说明后面指针指向的是连续空间的... -
C/C++中,多个指针指向同一个内存,只能free一次
2018-11-22 10:14:54#include<stdio.h> #include<malloc.h> int main() { printf("hello main\n"); int N = 1000;... //同一个内存地址只能free一次( free(p1);和free(p2... -
不要将两个指针变量指向同一块动态内存
2013-12-04 10:26:53如果将两个指针变量指向同一块动态内存,而其中一个生命期结束释放了该动态内存,这个时候就会出现问题,另一个指针所指向的地址虽然被释放了但该指针并不等于NULL,这就是所谓的悬垂指针错误,这种错误很难被察觉,... -
关于多指针指向同一块内存的问题
2017-09-15 15:19:12即其中一个指针delete了内存之后,其他指针无法判断该指向地址是否还有效,如果也去delete,这时自然会导致错误。 解决方案:严格遵照 谁申请,谁释放 的原则! 问题2:即使遵守谁申请谁释放的原则,其他指针还是... -
c语言指针指向地址的问题 求大神详细解答
2015-07-24 08:02:37#include int main(int argc, char const *argv[]) { int b=0x12345678; char *p4=(char *)&b; printf("p=0x%hhx\n",*p4 ); printf("p=0x%hhx\n",*(p4+1) ); char *p7="helloworld"; ... -
C/C++中的指针变量可以相互赋值,使得它们指向同一块地址空间
2019-11-02 16:00:18两个指针变量可以相互赋值吗? int *p, *q; p=q; 这样写是什么意思?是p指向q吗? 答:1.两个指针变量之间可以相互赋值,p和q都是int类型的指针。 p=q表示将q所指向的int类型变量的地址赋给p 2.两个都是指针,所以是p... -
C++判断两个指针指向的对象是否相同
2022-02-21 15:13:35class BaseA { public: int a;... } } 打印: pb = 0028FEE0 pd = 0028FED8 pb == pd 2、结论 虽然两个指针的值不同,但是编译器认为它们还是相等的,因为它们指向同一个对象。 所以直接用if(p1 == p2)判断即可 -
多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题
2014-08-18 14:35:24多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题 2 原文:http://www.haogongju.net/art/1694028 多继承时,父类指针指向子类对象时,父类指向的不是子类开始地址,而是子类... -
[Golang]两个对象的指针相同,一定是同一个对象吗?
2020-03-11 10:49:32开门见山 今天发现一个十分有趣的case,如下: package main import "fmt" func main() { n1 := make ([] int, 0,5) ... // 思考 n1和n2打印出的指针地址是否相同? fmt.Printf("address of n1:%p\n",... -
JS数组操作,赋值指向同一指针
2014-06-03 17:10:46解决这种数组赋值同一引用的问题 思路是构建一个数组的拷贝,有如下方法: 1、使用slice() 可使用slice()进行复制,因为slice()返回也是数组。 var array1 = new Array("1","2","3"); var array2... -
Go基础:指针地址、指针类型、多重指针、指针运算
2020-05-08 12:15:53目录 到底什么是指针呢? 指针 指针地址和指针类型 指针取值 ...内存就是一系列有序列号的存储单元,变量就是...指针指向变量的内存地址,指针就像该变量值的内存地址一样 我们来看一个代码片段 func main() { ... -
两个指针之间的运算
2017-03-28 21:31:24只有指向同一数组的俩个指针变量之间才可以进行计算。否则是没有意义的。 两指针变量相减 两指针变量相减所得之差是俩个指针所指数组之间相差的元素个数。实际上是俩个指针值(地址)相减之差再除以该数组元素的长度... -
如何判断两个引用是不是指向的同一个元素
2019-01-06 23:30:07其实引用,是一种受限的指针,所以看两个引用是不是指向的同一个元素,就是在比较两个引用指向的地址是不是同一块。引用必须被初始化。 template<typename T> bool CheckReference(T& t,T&... -
C语言指针——基础知识理解
2022-03-16 21:17:20强转与指针,并称C语言的两大神器,用好了可呼风唤雨,威力无比,用不好也会伤及自身 理解指针要从变量的地址谈 (1)内存是如何编址的? 内存中的每个字节都有唯一的编号(地址) 地址按字节编号,其字长... -
两个指针相减
2016-08-08 11:10:11如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目。 假设我住在广场路124号,Mag住在广场路142号,每家之间的地址间距是2(在我这一侧用连续的偶数作为街道地址),那麽Mag家就在我家往... -
两个指针相减的结果
2017-05-11 19:44:08例子: inta[3] ={1,2,3}; int* p; int* q; p= a; cout"p的地址:" cout"p指向的内容:" ... cout"q的地址:" ... cout"q指向的内容:" ... cout"两个指针的减法: