精华内容
下载资源
问答
  • 多个指针指向同一对象
    2022-02-21 15:13:35
    class BaseA
    {
       
    public:
        int a;
    };
     
    class BaseB
    {
       
    public:
        double b;
    };
     
    class Derived : public
    更多相关内容
  • C++ 多个指针指向同一个对象

    千次阅读 2019-03-16 14:01:36
    多个指针指向同一个对象。当对象被删除时,如果有指针没有被赋值为null,将可能出现不可预期的后果。

    问题

    在使用c++ 指针的时候,经常会遇到如下情况

        int *i = new int(1);
        int *j = i;
        delete i;
        i = NULL;
        if(j) {
            //此处代码依然运行
            std::cout << (*j) << std::endl;
        }
    

    多个指针指向同一个对象。当对象被删除时,如果有指针没有被赋值为null,将可能出现不可预期的后果。

    解决

        int *i = new int(1);
        int **j = &i;
        delete i;
        i = NULL;
        if(j) {
            if(*j) {
                std::cout << (**j) << std::endl;
            }
        }
    

    根据c++ 编码规范 谁创建,谁删除, 那么创建的时候,使用的指针是 i ,删除时也应该是用 i去删除,其他需要使用该对象的地方,使用二级指针,保存 i 的地址,当i被赋值为 null时,通过二级指针判断i 是否有效。

    注意

    i的生命周期要小于 j的时候,此方法不可用!!!

    展开全文
  • 总结:不要让两个指向同一地址的指针同时操作这内存空间,会出错 例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=null2
    	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;//地址为00F70C70022
    	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 随便都行
    展开全文
  • #include&lt;stdio.h&gt; #include&lt;malloc.h&gt; int main() { printf("hello main\n"); int N = 1000;... //同一内存地址只能free一次( free(p1);和free(p2...
    #include<stdio.h>
    #include<malloc.h>
    
    int main()
    {
    	printf("hello main\n");
    
    	int N = 1000;
    	int* p1 = (int*)malloc(N * sizeof(int));
    	int* p2 = p1;
    
    	//同一个内存地址只能free一次( free(p1);和free(p2); 二者选一执行,不能同时执行,否则报错 )
    	//free(p1);
    	free(p2); 
    
    	//释放后的内存为可再分配给其他指针的内存,
    	//(1)若此时没有再分配给其他指针,原指针处的内容不变
    	//(2)若分配给了其他指针,原指针处的内容会改变
    	//因此,释放内存后的指针变为野指针, 不能再使用,需要指向NULL
    
    	p1 = NULL;
    	p2 = NULL;
    
    	printf("goodbye main\n");
    	return 0;
    }

     

    若两个free同时执行,程序执行不下去,报错结果如下:

    展开全文
  • 看数据结构看到循环链表的合并,很奇怪为什么最后要free掉p,这样rearB->next不就会随机指向其他的内存了吗![图片说明](https://img-ask.csdn.net/upload/201708/16/1502850283_66326.png)
  • 多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题  2 原文:http://www.haogongju.net/art/1694028 继承时,父类指针指向子类对象时,父类指向的不是子类开始地址,而是子类...
  • 基类指针指向子类对象

    万次阅读 多人点赞 2018-07-03 10:10:44
    没有指定虚函数, 那么它就只能访问到类型对应的函数基类指针...正常情况,子类祖先类的析构函数都是虚拟的,这样删除祖先类指针、子类对象的时候,可正确同时调用子类和祖先类的析构函数):#include &lt;iost...
  • 多个指针指向同一个地址

    万次阅读 2017-11-19 20:02:30
    多个指针指向同一个地址,这样使用没什么问题,只是操作时要注意。 因为,每个指针变量保存的值,仅仅是指向的内容的地址值。多个指向同一个地址的指针,若其中一个指针等于NULL,不影响另一个指针。 代码 int* a...
  • 怎么避免两个指向同一地址的次释放问题本帖最后由 wallwind 于 2014-03-05 20:44:48 编辑比如以下代码#include#includeintmain(){int*ptr=malloc(10*sizeof(int));int*ptr2=ptr;if(ptr){free(ptr);ptr=NULL;...
  • 1:两个指针指向统一内存,一个指针进行++或者–操作,不会改变另一个指针的指向。 2:释放一个指针such as:free or delete。 另一个指针不会被释放,但不能再访问它指向的内存。
  • 现在在修改之前写的代码,发现其中一问题,示例代码如下: //Video.h class Video { public: Video(int nr, int nc); ~Video(); public: int* GetVideoData(); private: int *m_pBuff; } //Video.cpp Video...
  • 关于多指针指向同一块内存的问题

    千次阅读 2017-09-15 15:19:12
    有时为了逻辑实现的方便,在程序中会采用多指针指向同一块内存的设计,但是这同时会带来问题: 问题1:容易引发“野指针”错误!即其中一个指针delete了内存之后,其他指针无法判断该指向地址是否还有效,如果也去...
  • void DestoryList(ListNode *&L) { ListNode *s,*r; s = L->next; while (s != NULL) ...//不能用这种方法,因为free的机制是使得这部分...答案是不行的,因为free的机制是让该指针变量所指的地址可以随意被调...
  • JS数组操作,赋值指向同一指针

    千次阅读 2014-06-03 17:10:46
    解决这种数组赋值同一引用的问题 思路是构建一数组的拷贝,有如下方法: 1、使用slice() 可使用slice()进行复制,因为slice()返回也是数组。 var array1 = new Array("1","2","3"); var array2...
  • JSON.parse(JSON.stringify(this.tableData))
  • 在前面一篇文章中,我们了解了 C++11 中引入的智能指针之一 shared_ptr 和 weak_ptr ,今天,我们来介绍...这一点和我们前面介绍的 shared_ptr 类型指针有很大的不同:shared_ptr 允许多个指针指向同一对象,而 uniqu
  • 在基类与派生类之间,有一规定:派生类对象的地址可以赋给指向基类对象指针变量(简称基类指针),即基类指针也可以指向派生类对象。为什么有这一规定呢?因为它可以实现态性【1】,即向不同的对象发送同一...
  • 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承而来的那些成员,不能访问子类特有的元素,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;...
  • 基类指针和子类指针相互赋值

    万次阅读 2012-06-30 19:45:13
    首先,给出基类animal和子类fish //============================================================== // animal.h // ...// describe: 非虚函数情况下,将子类指针赋给积累指针,验证最终调用 //
  • 首先理解指针指向元素与指针,他的意思就相当于地图上你家的位置与你家里的实际情况。知道了**指针**(地图上的位置),就可以知道怎么去你家,但是无法知道你家中的具体情况,而指向元素则涵括了你家里的实际...
  • C++指向数组元素的指针 在C++中,一变量有地址,一数组包含若干元素,每数组元素都在内存中占用存储单元,它们都有相应的地址;指针变量既然可以指向变量,也可以指向数组元素,所谓数组元素的指针就是数组...
  • 多个进程访问同一文件的解决方法

    千次阅读 2016-10-21 22:46:00
    如果多个用户对一个文件进行操作的时候?如何来解决?考虑用文件锁的形式和多路复用的形式 ①文件锁 使用flock(锁定文件或解除锁定)函数 头文件:#include 函数原型:int flock(int fd,int operation); 函数...
  • C++ 构造函数与对象指针

    千次阅读 2022-04-07 20:22:50
    内含知识点包括: 构造函数 对象指针 公用对象的保护(const) 食用愉快~
  • c++指针复制指向同一位置问题

    千次阅读 2015-04-07 14:46:36
    今天看primer c++遇到一问题,希望以后能够解决,暂时保留此贴 #include #include #include using namespace std; class HasPtr { public: HasPtr(int *p, int i):ptr(p), val(i){} int *get_ptr() const {...
  • 具体而言,复制对象时,副本和原对象指向同一存储区域,如果通过一副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况。  普通...
  • 和其他指针一样,函数指针指向某种特定类型,所有被同一指针运用的函数必须具有相同的形参类型和返回类型。 int (*pf)(int, int); // 声明函数指针 这里,pf指向的函数类型是int (int, int),即函数的参数是两...
  • 关于多个线程同时调用单例模式的对象,该对象中方法的局部变量是否会受多个线程的影响 对于那些会以多线程运行的单例类,例如Web应用中的Servlet,每个方法中对局部变量的操作都是在线程自己独立的内存区域内完成的...
  • 智能指针用法及其代码详解

    千次阅读 2022-04-27 13:39:57
    智能指针不是一个指针,它其实是一个对象。它是通过C++的RAII机制实现的。主要是利用C++中对象在释放的时候,会自动调用析构函数这一特性。 所以,当智能指针对象释放的时候,在智能指针对象的析构函数中来释放其...
  • iOS开发对象指针

    千次阅读 2017-05-23 10:47:46
    UIImageView * imgv=[[UIImageView alloc]init]; imgv是指针,指针指向的是对象。  [[UIImageView alloc]init]; 创建了一个对象 ...指针指向对象在内存中的一个地址 通过这个指针找到内存中的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,320
精华内容 67,328
关键字:

多个指针指向同一对象