zoukankan      html  css  js  c++  java
  • C++指针悬挂(赋值运算符重载)

    如:

    string a("sky1"),b("sky2") ;

    b = a ;

    程序在运行的时候创建了两个对象,分别是a和b,然后调用构造函数。当执行“b=a”的时候,因为没有用户自己定义的赋值运算符函数,于是程序自动调用默认的赋值函数,两个指针指向了同一个内存,“sky2”这个空间的内存应经不能访问了。当程序执行到析构函数,释放内存时,先撤销b,释放了b指向的内存,接着在释放a,然而,虽然a的指针还在,但是,因为它与b指向的是同一内存,又由于“sky1”的内存空间已经被执行析构b的时候释放掉,现在执行a在此释放,无法找到要释放的内存,并且,之前b指向的内存还没有释放掉,析构函数找不到它在哪里?就出现了所谓的“指针悬挂问题”。

    如下解决:

    #include<iostream>
    #include<string.h>
    using namespace std;
    
    class String
    {
    public :
        String(int size = 1,char * str = "")
        {
            ptr = new char[size];
            strcpy(ptr,str);
            this->size = size;
         }
         String(const String &obj)
         {
             size = obj.size;
             ptr = new char[size];
             strcpy(ptr,obj.ptr);
         }
         String operator=(const String & obj)//避免造成指针悬挂问题
         {
              size = obj.size;
              delete [] ptr;//先释放原来的内存
              ptr = new char[size];//生成新的内存
              strcpy(ptr,obj.ptr);//拷贝字符串
              return *this;
         }
         ~String()
         {
              delete [] ptr;
         }
    private :
        char *ptr;
        int size;
    };
    int main()
    {
        String str1(10,"HangZhou"),str2(10,"HDU");
        str2 = str1;//容易造成指针悬挂
        return 0;
    }
  • 相关阅读:
    内存映射文件原理探索(转)
    inux内存映射和共享内存理解和区别
    MySQL中的sleep函数介绍
    flask源码解析之上下文为什么用栈
    linux system函数详解
    Python中的可迭代对象、迭代器和生成器,协程的异同点
    GB2312汉字区位码、交换码和机内码转换方法 (ZT)
    pthread_cond_signal该放在什么地方?
    IPC介绍——10个ipcs例子
    lsof
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/4223002.html
Copyright © 2011-2022 走看看