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;
    }
  • 相关阅读:
    linux本地文件上传之RZ/SZ和sftp
    sql优化
    sql server 类oracle vm_contact() 函数创建
    sql server 执行大.sql文件
    group by having和connect by
    sql server内置函数
    oracle内置函数
    oracle字符串处理函数
    oracle字符串处理相关
    团队-象棋游戏-模块开发过程
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/4223002.html
Copyright © 2011-2022 走看看