대입 함수 편

1788 단어

1. 할당 함수 얕은 복사 문제:


먼저 코드를 보십시오:
//base.h
#ifndef BASE_H
#define BASE_H
#include 

class Base
{
    private:
      ptr;
      size_t len;
  public:
    Base(const char *val);
    ~Base();
    void print() const;
    void init(const char *val);
  };

 //base.cpp
#include 
#include 
using namespace std;
Base::Base(const char *val) : ptr(val),len(0)
{
   init(val);
}
void Base::init(const char *val)
{
  if(val)
    {
        len = strlen(val);
        ptr = new char[len + 1];
        bzero(ptr,len + 1);
        strncpy(ptr,val,len);
    }
}
  
Base::~Base()
{
    if(ptr)
    {
      delete ptr;
      ptr = NULL;
    }
    len = 0;
}
void Base::print() const
{
    std::cout << "ptr: " << (ptr ? ptr :" ") << " len:" << len << std::endl;
}

int main()
{
    Base base1("1");
    base1.print();
    //  
    {
        Base base2("2");
        base2.print();
        base1 = base2;
    }
    base1.print();
    return 0
}

위 코드를 보니 자기가 상상했던 것과 다른 것 같아. 왜?얕은 복사로 인해 베이스 1 대상의 ptr가 가리키는 메모리가 영원히 잃어버렸다. 그리고 베이스 1의 ptr는 베이스 2의 ptr(실제로는 방출되었다)를 가리키고 얕은 복사는 시스템 내에 만들어진 형식의 데이터에만 적합하다. 이런 상황을 방지하기 위해 우리는 부치 함수에서 깊은 복사(이른바 깊은 복사란 복사 대상의 모든 바이트)를 실현해야 한다. 코드는 다음과 같다.
//base.h
Base&  operator= (const Base& base);
inline const char* getPrt() const
{
    return ptr;
}
//base.cpp
Base& operator= (const Base& base)
{
    //          
    if(&base == this)
    {
        return *this;
    }
    if(ptr)
    {
        delete ptr;
        ptr = NULL;
        len = 0;
      }
      init(base.getPtr());
      return *this;
}

위에서 우리는 부치 함수를 실현했고 운행해 보니 결과가 우리가 예상한 것과 같다!

좋은 웹페이지 즐겨찾기